https://raw.githubusercontent.com/ajmaradiaga/feeds/main/scmt/topics/SAP-BTP-Security-blog-posts.xml SAP Community - SAP BTP Security 2026-07-24T20:00:18.092161+00:00 python-feedgen SAP BTP Security blog posts in SAP Community https://community.sap.com/t5/technology-blog-posts-by-members/agentic-ai-on-btp-a-multi-agent-app-with-pydantic-ai/ba-p/14388029 Agentic AI on BTP: a Multi‑Agent App with Pydantic AI 2026-05-03T14:04:10.563000+02:00 WouterLemaire https://community.sap.com/t5/user/viewprofilepage/user-id/9863 <H2 id="toc-hId-1795240167"><SPAN>Introduction</SPAN></H2><P><SPAN>In the previous post I built <A href="https://community.sap.com/t5/technology-blog-posts-by-members/agentic-ai-on-btp-a-single-agent-with-langgraph/ba-p/14388025" target="_self">btp-agent</A>: a single LangGraph agent in a CAP app that wires up five BTP MCP servers (Cloud Integration, AI Core, BTP Core, Audit Log, Cloud Foundry V3) and lets users chat with their full BTP landscape. It worked, but it hit some limitations. With all five MCP servers plugged in, the model saw well over a hundred tools on every turn. Latency climbed, the model reached number of tool limits and the single orchestrator prompt got asked to be an expert in integration flows, AI deployments, audit events and CF applications all at once. For a live demo that is survivable. For anything that wants to scale, it isn’t.</SPAN></P><P><SPAN>So I took the agent apart.</SPAN></P><P>&nbsp;</P><H2 id="toc-hId-1598726662"><SPAN>Why</SPAN></H2><P><SPAN>The natural cut line is the MCP server: each server already represents a bounded domain (CI, AI Core, BTP Core, etc.), and each one has its own vocabulary of tools. If every MCP server gets its own specialist agent, each agent’s prompt becomes short and focused, each agent’s tool list becomes small and the model can actually reason about which tool to call. An orchestrator agent on top then decides which specialist(s) to delegate to for a given question and stitches the answers together.</SPAN></P><P><SPAN>I switched the stack from CAP/TypeScript to Python with Pydantic AI for this step. Pydantic AI gives me typed agents, typed tool calls and first‑class MCP client support, which means each specialist is about thirty lines of code. It also made it natural to treat delegation as just another tool on the orchestrator, which is a pattern that maps cleanly onto how LLMs already think about tool use.</SPAN></P><P>&nbsp;</P><H2 id="toc-hId-1402213157"><SPAN>How</SPAN></H2><P><SPAN>btp-multiagent-app keeps the same philosophy as before, everything runs on BTP, everything reuses the user’s identity but the internals are rearranged. A chat entry point (app.py) receives the user’s message and hands it to the orchestrator. The orchestrator (agents/orchestrator.py) has no tools of its own other than a set of delegation tools pointing at the specialists:</SPAN></P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="WouterLemaire_0-1777809659345.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/405455i05DF4AB1FE6F5690/image-size/large?v=v2&amp;px=999" role="button" title="WouterLemaire_0-1777809659345.png" alt="WouterLemaire_0-1777809659345.png" /></span></P><P><EM>Figure 1 — btp-multiagent-app solution diagram (L2). Editable .drawio version included with this post.</EM></P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="WouterLemaire_1-1777809659351.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/405456iEF120497521548D0/image-size/large?v=v2&amp;px=999" role="button" title="WouterLemaire_1-1777809659351.png" alt="WouterLemaire_1-1777809659351.png" /></span></P><P><EM>Figure 2 — Screenshot of the chat UI delegating across specialists (placeholder — replace before publishing).</EM></P><UL><LI><SPAN>Cloud Foundry specialist: operations against CF V3 via its MCP server</SPAN></LI><LI><SPAN>BTP specialist: BTP Core Services via its MCP server</SPAN></LI><LI><SPAN>Audit log specialist: scaffolded and disabled while I iterate on scopes</SPAN></LI></UL><P><SPAN>Each specialist wraps an MCP client that speaks Streamable HTTP to its MCP server, authorised with OAuth 2.1. A small shared module (agents/shared.py) centralises the AI Core GenAI Hub model setup, the MCP client factory and the OAuth flow, so every specialist is stamped from the same template. A legacy agent.py sits next to the new agents/ package as a reference to the single‑agent design from the previous post, useful when explaining the migration.</SPAN></P><H3 id="toc-hId-1334782371"><SPAN>Key configuration patterns</SPAN></H3><P><SPAN>The app supports two credential layouts for AI Core so it runs comfortably both locally and on CF:</SPAN></P><UL><LI><SPAN>Individual environment variables — AICORE_AUTH_URL, AICORE_CLIENT_ID, AICORE_CLIENT_SECRET, AICORE_BASE_URL, AICORE_RESOURCE_GROUP.</SPAN></LI><LI><SPAN>A single AICORE_SERVICE_KEY JSON — the whole service key dropped in as one variable, handy on CF where a service binding gives you exactly that shape.</SPAN></LI></UL><P><SPAN>MCP server URLs are injected the same way: MCP_CLOUDFOUNDRY_URL, MCP_BTP_URL and MCP_AUDITLOG_URL. Locally you get them by running the MCP servers on 127.0.0.1; on CF the mta.yaml descriptor wires them to the deployed hosts. The AI Core binding is attached automatically so you don’t have to ship credentials into the image.</SPAN></P><H2 id="toc-hId-1009186147">&nbsp;</H2><H2 id="toc-hId-812672642"><SPAN>What the orchestrator actually does</SPAN></H2><P><SPAN>The orchestrator is deliberately small. Its prompt tells it: you are a BTP operations assistant; you have the following specialists available; when a user asks a question, decide which specialist(s) can answer, call them, and combine their output into a single response. Under the hood, each delegation tool invokes the corresponding specialist agent with a sub‑prompt, collects the result and returns it to the orchestrator. That lets the model reason at two levels (routing at the top, tool selection inside each specialist) which is exactly what the single‑agent design was trying and failing to do in one go.</SPAN></P><P><SPAN>The outcome is measurable. Tool lists per agent drop from "well over a hundred" to "a dozen or two", token usage per turn drops with them and the agent stops hallucinating tool names because each specialist only knows the tools that actually make sense for its domain. Debugging also gets easier: when something goes wrong, you can tell whether the orchestrator mis‑routed or the specialist mis‑used a tool, just by reading the trace.</SPAN></P><H2 id="toc-hId-616159137">&nbsp;</H2><H2 id="toc-hId-419645632"><SPAN>What I learned (and the OAuth honesty section)</SPAN></H2><P>The multi‑agent pattern pays for itself instantly. Tool lists per agent drop from "well over a hundred" to "a dozen or two", token usage per turn drops with them, no tool-overload and the model stops hallucinating tool names because each specialist only sees the tools that make sense for its domain. OAuth 2.1 against the MCP servers also works fine once deployed, Pydantic AI ships a web client that handles the consent flow inside the running app, so the same code path that works locally works on Cloud Foundry.</P><P>What this iteration did make obvious is that the list of specialists is still compiled into the code. Add a sixth MCP server and you have to edit the application, rebuild and redeploy. Fine while the list is short, not a pattern that scales to something like an AI Data Enabler exposing dozens of APIs to LLMs, which is where the next post goes.</P><P>&nbsp;</P><H2 id="toc-hId-223132127"><SPAN>Solution &amp; references</SPAN></H2><H3 id="toc-hId-155701341"><SPAN>Build &amp; deploy</SPAN></H3><P><SPAN>This one is a Python FastAPI app with a Node.js approuter in front of it. Prerequisites: Python 3.11+, Node.js 20+ (for the approuter), mbt and the Cloud Foundry CLI with the MultiApps plugin.</SPAN></P><P><SPAN>Local development:</SPAN></P><pre class="lia-code-sample language-abap"><code>git clone https://github.com/lemaiwo/btp-multiagent-app.git cd btp-multiagent-app python -m venv .venv &amp;&amp; source .venv/bin/activate pip install -r requirements.txt # point the app at your AI Core + MCP servers export AICORE_SERVICE_KEY='{"clientid":"...","clientsecret":"...","url":"...","serviceurls":{"AI_API_URL":"..."}}' export MCP_CLOUDFOUNDRY_URL=https://&lt;your-cf-mcp&gt;.cfapps.&lt;region&gt;.hana.ondemand.com/mcp export MCP_BTP_URL=https://&lt;your-btp-mcp&gt;.cfapps.&lt;region&gt;.hana.ondemand.com/mcp python -m uvicorn app:app --host 127.0.0.1 --port 7932</code></pre><P><SPAN>On first chat, each MCP client triggers the OAuth 2.1 browser flow against localhost:3000/callback. Tokens are cached afterwards.</SPAN></P><P><SPAN>Build and deploy to BTP Cloud Foundry:</SPAN></P><pre class="lia-code-sample language-abap"><code>mbt build # -&gt; mta_archives/*.mtar cf login -a &lt;api-endpoint&gt; -o &lt;org&gt; -s &lt;space&gt; cf deploy mta_archives/&lt;name&gt;.mtar</code></pre><P><SPAN>The MTA contains two modules, the Python FastAPI app (pydantic-agent, started as python -m uvicorn app:app --host 0.0.0.0 --port $PORT) and the approuter which binds xsuaa (application plan) plus AI Core (extended plan). MCP server URLs are injected as env vars per module. Reminder: production CF cannot use the localhost OAuth2 callback; switch to client-credentials or pre-provisioned tokens before you promote the deployment.</SPAN></P><P><SPAN>Code: <A href="https://github.com/lemaiwo/btp-multiagent-app" target="_blank" rel="noopener nofollow noreferrer">github.com/lemaiwo/btp-multiagent-app</A></SPAN></P><P><SPAN>Previous post: <A href="https://community.sap.com/t5/technology-blog-posts-by-members/agentic-ai-on-btp-a-single-agent-with-langgraph/ba-p/14388025" target="_self"><EM>Building a BTP Agent with LangGraph</EM></A></SPAN></P><P><SPAN>Next up: making the set of specialists dynamic, so new agents can be created through an admin UI without redeploying the app:&nbsp;<A href="https://community.sap.com/t5/technology-blog-posts-by-members/agentic-ai-on-btp-dynamic-multi-agent-on-demand-with-pydantic-ai/ba-p/14388032#M178664" target="_blank">https://community.sap.com/t5/technology-blog-posts-by-members/agentic-ai-on-btp-dynamic-multi-agent-on-demand-with-pydantic-ai/ba-p/14388032#M178664</A>&nbsp;</SPAN></P> 2026-05-03T14:04:10.563000+02:00 https://community.sap.com/t5/technology-blog-posts-by-members/agentic-ai-on-btp-dynamic-multi-agent-on-demand-with-pydantic-ai/ba-p/14388032 Agentic AI on BTP: Dynamic Multi‑Agent on Demand with Pydantic AI 2026-05-03T14:10:16.444000+02:00 WouterLemaire https://community.sap.com/t5/user/viewprofilepage/user-id/9863 <H2 id="toc-hId-1795240191"><SPAN>Introduction</SPAN></H2><P><SPAN>Post one introduced the <A href="https://community.sap.com/t5/technology-blog-posts-by-members/odata-mcp-proxy-introduction/ba-p/14348684" target="_self">OData MCP Proxy</A> and gave us five BTP MCP servers by configuration. Post two took those MCP servers and wrapped them in <A href="https://community.sap.com/t5/technology-blog-posts-by-members/agentic-ai-on-btp-a-single-agent-with-langgraph/ba-p/14388025" target="_self">a Pydantic AI multi‑agent application</A>: an orchestrator on top, one specialist per MCP server below. That fixed the tool‑overload problem the original single‑agent design had hit. But it left one uncomfortable property in place: the list of specialists was still hard‑coded. Adding another MCP server meant editing the repo and redeploying. For my own BTP management experiments that is acceptable. For a broader scenario (say, an AI Data Enabler that wants to expose many, many APIs to LLMs safely) it very clearly isn’t.</SPAN></P><P><SPAN>So in this final iteration I made the agents themselves first‑class, dynamic objects: created, edited, deleted and reloaded without ever restarting the app.</SPAN></P><P>&nbsp;</P><H2 id="toc-hId-1598726686"><SPAN>Why</SPAN></H2><P><SPAN>Two forces push you towards this design. The first is scale. If every domain, every data product, every API surface deserves its own specialist agent, you don’t want to ship a new release every time someone publishes a new API. You want the platform to accept an agent definition the same way a data platform accepts a new table. The second is governance. Treating agent configurations as data (rather than code) means you can export them, version them, review them, diff them and re‑import them. It also gives you a natural place to attach role‑based access: who can create agents, who can only consume them, who can re‑load the orchestrator.</SPAN></P><P><SPAN>btp-dynamic-multiagent-app takes those two ideas seriously. Every agent lives as a row in a database. A small admin UI lets an authorised user create, edit and disable agents and a Reload button rebuilds the orchestrator in memory without restarting the container.</SPAN></P><P>&nbsp;</P><H2 id="toc-hId-1402213181"><SPAN>How</SPAN></H2><P><SPAN>The request path is straightforward. A user hits the approuter, the approuter terminates XSUAA authentication and forwards the request to a FastAPI app. Inside FastAPI there are two logical surfaces: /chat, served by the dynamic orchestrator, and /admin, served by a CRUD API plus a small HTML admin page. Both sit behind the same JWT; the admin routes additionally require an admin scope so the UI can only be used by users with the right role collection.</SPAN></P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="WouterLemaire_0-1777809980153.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/405458iAA56F00C6E5CC042/image-size/large?v=v2&amp;px=999" role="button" title="WouterLemaire_0-1777809980153.png" alt="WouterLemaire_0-1777809980153.png" /></span></P><P><EM>Figure 1 — btp-dynamic-multiagent-app solution diagram (L2). Editable .drawio version included with this post.</EM></P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="WouterLemaire_1-1777809980157.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/405457i5E85B316648B1385/image-size/large?v=v2&amp;px=999" role="button" title="WouterLemaire_1-1777809980157.png" alt="WouterLemaire_1-1777809980157.png" /></span></P><P><EM>Figure 2 — Screenshot of the admin UI adding a new agent (placeholder — replace before publishing).</EM></P><P><SPAN>The pieces that make it dynamic:</SPAN></P><UL><LI><SPAN>agents/db.py: SQLAlchemy models for the agent configuration (name, description, instructions, MCP URL, enabled flag). PostgreSQL in production, SQLite locally so you can iterate without infra.</SPAN></LI><LI><SPAN>agents/registry.py: a builder that reads the current set of enabled agent records, constructs Pydantic AI agents from them on the fly, and produces a fresh orchestrator with delegation tools pointing at each specialist.</SPAN></LI><LI><SPAN>agents/admin.py: a REST API for CRUD plus a Reload endpoint that calls into the registry to swap in the newly built orchestrator.</SPAN></LI><LI><SPAN>agents/auth.py: XSUAA JWT validation and a contextvar‑bound token forwarder so every MCP call made during a request carries the original user’s identity.</SPAN></LI><LI><SPAN>agents/chat_app.py: a dynamic ASGI wrapper for the chat interface so the underlying agents can be swapped at runtime.</SPAN></LI><LI><SPAN>templates/admin.html + agents.seed.json: the admin UI and a bootstrap configuration for cold starts.</SPAN></LI></UL><P>&nbsp;</P><H2 id="toc-hId-1205699676"><SPAN>How an operator adds a new agent</SPAN></H2><P><SPAN>In the admin UI an operator clicks "+ New agent", fills in a name, a short description, the system instructions for that specialist and the URL of its MCP server. Saving writes a row. Clicking "Reload agents" asks the registry to rebuild the orchestrator; the new specialist appears in the delegation tool set from the very next chat message. No redeploy. No CF restart (although there is an optional Restart‑app button that can trigger one, if you have a technical‑user service binding to the CF API and you actually want that).</SPAN></P><P><SPAN>On top of the live CRUD you get export and import of the full agent set as a JSON snapshot. That is small but it is what turns agent definitions from "config in a live DB somewhere" into "versionable artefact you can put in Git". It is also how you seed a new environment from a known‑good baseline rather than clicking your way through twenty entries.</SPAN></P><P>&nbsp;</P><H2 id="toc-hId-1009186171"><SPAN>Security and identity propagation</SPAN></H2><P><SPAN>Because everything runs on BTP behind the approuter, identity is not something this app invents. Every request already arrives with a validated XSUAA JWT; agents/auth.py pins it into a contextvar for the duration of the request. When a delegated specialist calls its MCP server, the middleware grabs that token and forwards it as a bearer credential. The MCP server authorises using the caller’s actual permissions, not a shared service account. The admin surface is gated by a dedicated "Pydantic Agent Administrator" role collection, so only authorised users can create or modify agents. Normal chat users never see the admin UI.</SPAN></P><P>&nbsp;</P><H2 id="toc-hId-812672666"><SPAN>Why this matters for the AI Data Enabler</SPAN></H2><P><SPAN>This is the design I want for any serious "expose‑your‑APIs‑to‑LLMs" story. A centralised MCP server that tries to host tools for every API in the organisation becomes a hot mess very quickly: the tool list explodes, governance becomes all‑or‑nothing, and a single team ends up owning everything. A dynamic multi‑agent app inverts that. Each API surface can publish its own MCP server, owned by its own team, registered as an agent in the platform by its owner and consumed through the same orchestrator. The orchestrator sees a small, stable set of specialists; specialists see small, focused tool lists; identity flows through on every call. You can scale the number of exposed APIs without scaling the complexity of any single component.</SPAN></P><P>&nbsp;</P><H2 id="toc-hId-616159161"><SPAN>Lessons learned</SPAN></H2><UL><LI><SPAN>Treating agent definitions as data is a much bigger win than it sounds like. Export/import, diffing, code review, all of it becomes free once the definition lives in a row instead of in a module.</SPAN></LI><LI><SPAN>Reloading an agent graph in place is subtle. The trick was to keep the chat ASGI wrapper thin and always resolve the current orchestrator lazily, so swapping the instance is atomic from the request’s point of view.</SPAN></LI><LI><SPAN>Role‑based admin access from day one avoids retrofits later. If the platform can edit agents, it needs a scope for it, full stop.</SPAN></LI><LI><SPAN>Using SQLite locally and PostgreSQL on CF kept the inner loop fast without forcing a separate "dev" code path.</SPAN></LI></UL><P>&nbsp;</P><H2 id="toc-hId-419645656"><SPAN>Solution &amp; references</SPAN></H2><H3 id="toc-hId-352214870"><SPAN>Build &amp; deploy</SPAN></H3><P><SPAN>Same FastAPI + approuter shape as btp-multiagent-app, with a PostgreSQL service added for the agent registry. Prerequisites: Python 3.11+, Node.js 20+, mbt, and the Cloud Foundry CLI with the MultiApps plugin.</SPAN></P><P><SPAN>Local development:</SPAN></P><pre class="lia-code-sample language-abap"><code>git clone https://github.com/lemaiwo/btp-dynamic-multiagent-app.git cd btp-dynamic-multiagent-app python -m venv .venv &amp;&amp; source .venv/bin/activate pip install -r requirements.txt # local uses SQLite automatically — no Postgres needed to iterate export AICORE_SERVICE_KEY='{"clientid":"...","clientsecret":"...","url":"...","serviceurls":{"AI_API_URL":"..."}}' python -m uvicorn app:app --host 127.0.0.1 --port 7932 # then open http://127.0.0.1:7932/admin to seed agents from agents.seed.json</code></pre><P><SPAN>Build and deploy to BTP Cloud Foundry:</SPAN></P><pre class="lia-code-sample language-abap"><code>mbt build # -&gt; mta_archives/*.mtar cf login -a &lt;api-endpoint&gt; -o &lt;org&gt; -s &lt;space&gt; cf deploy mta_archives/&lt;name&gt;.mtar</code></pre><P><SPAN>The MTA contains the same pydantic-agent Python module and pydantic-agent-approuter Node.js module, and adds a PostgreSQL (postgresql-db, standard plan) resource for the agent registry alongside xsuaa and AI Core. After the first deploy: assign the "Pydantic Agent Administrator" role collection to the users who should be able to create or modify agents, then open /admin to import your agents.seed.json baseline.</SPAN></P><P><SPAN>Code: <A href="https://github.com/lemaiwo/btp-dynamic-multiagent-app" target="_blank" rel="nofollow noopener noreferrer">github.com/lemaiwo/btp-dynamic-multiagent-app</A></SPAN></P><P><SPAN>Editable diagram: </SPAN>03-btp-dynamic-multiagent-architecture.drawio<SPAN> (shipped alongside this post).</SPAN></P><P><EM><SPAN>Previous posts in the series: <A href="https://community.sap.com/t5/technology-blog-posts-by-members/odata-mcp-proxy-introduction/ba-p/14348684" target="_self">OData MCP Proxy Introduction</A>, <A href="https://community.sap.com/t5/technology-blog-posts-by-members/agentic-ai-on-btp-a-single-agent-with-langgraph/ba-p/14388025" target="_self">btp-agent</A>, <A href="https://community.sap.com/t5/technology-blog-posts-by-members/agentic-ai-on-btp-a-multi-agent-app-with-pydantic-ai/ba-p/14388029" target="_self">btp-multiagent-app</A>.</SPAN></EM></P><P><SPAN>With this iteration the loop closes: any OData service can become an MCP server with a config file; any MCP server can become a specialist agent with a row in a database and the orchestrator keeps the user experience to a single conversation.&nbsp;</SPAN></P> 2026-05-03T14:10:16.444000+02:00 https://community.sap.com/t5/technology-blog-posts-by-sap/application-vulnerability-report-now-scanning-your-applications-beyond-eu/ba-p/14393613 Application Vulnerability Report: Now Scanning Your Applications Beyond EU Landscapes 2026-05-11T15:27:59.030000+02:00 Fabian_Richter https://community.sap.com/t5/user/viewprofilepage/user-id/1859514 <P><SPAN>The threat landscape does not respect regional boundaries. Vulnerabilities in your deployed applications are equally critical whether your workloads run in Frankfurt, the US, or Tokyo. Since launching the AVR beta on EU-10, we have heard consistent feedback from customers operating across multiple BTP landscapes: "We need visibility into our non-EU deployments too."</SPAN></P><P><SPAN>At the same time, the current security climate has made it clear that waiting for a full multi-region rollout would leave too many applications without coverage. We decided to act.</SPAN></P><H1 id="toc-hId-1666937743"><SPAN>What We Have Done: Cross-Region Scanning</SPAN></H1><P><SPAN>Application Vulnerability Report is currently available as a beta on EU-10. While <STRONG>the service is not yet subscribable in other landscapes</STRONG>, we have significantly expanded our scanning scope. AVR now scans applications deployed across 42 Cloud Foundry landscapes globally - including US, Asia-Pacific, Japan, Brazil, and additional EU landscapes beyond the original EU-10.</SPAN></P><P><SPAN>Think of this as a <STRONG>bridge solution</STRONG>: we are extending our scanning reach now, while native service availability in additional regions remains on our roadmap.</SPAN></P><H1 id="toc-hId-1470424238"><SPAN>How It Works</SPAN></H1><P><SPAN>Our scanning infrastructure - including the vulnerability scanner, the databases, and all processing logic - operates from our central EU datacenters. From there, AVR reaches out to all supported landscapes, collects the relevant application dependency information, and performs the vulnerability analysis centrally.</SPAN></P><P><SPAN>The results - your security findings and vulnerability data - are stored in our EU-based infrastructure and made available to you through the BTP Cockpit integration you already know from the beta.</SPAN></P><H1 id="toc-hId-1273910733"><SPAN>Covered Landscapes</SPAN></H1><P><SPAN>The following Cloud Foundry landscapes are now included in AVR scanning:</SPAN></P><UL><LI><SPAN>EU: eu01, eu02, eu10, eu10-002, eu10-003, eu10-004, eu10-005, eu11, eu13, eu20, eu20-001, eu20-002, eu22, eu30, eu31</SPAN></LI><LI><SPAN>US: us01, us02, us10, us10-001, us10-002, us11, us20, us21, us21-001, us22, us30, us32</SPAN></LI><LI><SPAN>Asia-Pacific: ap01, ap10, ap11, ap12, ap20, ap21, ap30, ap31</SPAN></LI><LI><SPAN>Japan: jp01, jp10, jp20, jp30, jp31</SPAN></LI><LI><SPAN>Brazil: br10, br20, br30</SPAN></LI><LI><SPAN>Other: ch20, uk20</SPAN></LI></UL><P><STRONG><SPAN>Excluded landscapes: </SPAN></STRONG><SPAN>Due to regulatory and compliance constraints, the following landscapes are excluded from scanning: ae01 (United Arab Emirates), ca10 and ca20 (Canada), cn01, cn10, cn20, and cn40 (China).</SPAN></P><H1 id="toc-hId-1077397228"><SPAN>Important: Data Residency Considerations</SPAN></H1><P><FONT color="#FF0000"><STRONG>Please note: Because the scanner and all databases operate in the EU, vulnerability and security findings for applications deployed in any landscape will be stored in EU datacenters.</STRONG></FONT></P><P><SPAN>This is relevant if your organization requires security data to remain in the same region where your applications are deployed. Specifically:</SPAN></P><UL><LI><SPAN>All vulnerability findings - regardless of the landscape your application runs in - are transmitted to and stored in EU.</SPAN></LI><LI><SPAN>No scanning infrastructure is deployed locally in non-EU regions at this time.</SPAN></LI></UL><P><SPAN>We want to be fully transparent about this so you can make an informed decision.</SPAN></P><H1 id="toc-hId-880883723"><SPAN>What is on the Roadmap</SPAN></H1><P><SPAN>This cross-region scanning capability is our interim response to an urgent need. Looking ahead, our roadmap includes:</SPAN></P><UL><LI><SPAN>Full landscape-native subscriptions in additional regions, where both scanning and data storage operate locally in the respective region.</SPAN></LI><LI><SPAN>Integration with SAP Cloud ALM - enabling you to manage vulnerability findings alongside your broader application lifecycle management.</SPAN></LI><LI><SPAN>General availability of Application Vulnerability Report as a commercially subscribable service.</SPAN></LI></UL><P><SPAN>We will keep you updated as these milestones progress.</SPAN></P><H1 id="toc-hId-684370218"><SPAN>Try It Out</SPAN></H1><P><SPAN>If you are already part of the AVR beta, cross-region scanning is available to you automatically - no action required on your side. If you have not joined the beta yet, there has never been a better time - especially if you have workloads running across multiple BTP landscapes.</SPAN></P> 2026-05-11T15:27:59.030000+02:00 https://community.sap.com/t5/technology-blog-posts-by-members/automate-extraction-project-users-maintained-as-cloud-foundry-org-space/ba-p/14393614 Automate Extraction – Project Users Maintained as Cloud Foundry Org/Space Members 2026-05-11T16:23:58.128000+02:00 shasankgupta024 https://community.sap.com/t5/user/viewprofilepage/user-id/877731 <P><FONT color="#0000FF"><EM><STRONG>Introduction</STRONG></EM></FONT></P><DIV><P>While reviewing SAP BTP Cloud Foundry access, I ran into a common operational challenge: users who were no longer part of a project were still maintained as Cloud Foundry org or space members.</P><P>Checking this manually across multiple SAP BTP subaccounts is time-consuming. Each subaccount may have a Cloud Foundry org, multiple spaces, and different user role assignments. If the landscape spans multiple Cloud Foundry API endpoints, the effort increases further.</P><P>In this blog, I am sharing an automation approach I used to extract Cloud Foundry org and space membership details across SAP BTP subaccounts and consolidate the results into CSV reports for review.</P><P><FONT color="#0000FF"><EM><STRONG>Problem Statement</STRONG></EM></FONT></P><DIV><P>Cloud Foundry access in SAP BTP is maintained at different levels:</P><UL><LI>Organization level</LI><LI>Space level</LI></UL><P>Users may be assigned roles such as:</P><UL><LI>Org Manager</LI><LI>Org Auditor</LI><LI>Org User</LI><LI>Space Manager</LI><LI>Space Developer</LI><LI>Space Auditor</LI><LI>Space Supporter</LI></UL><P>When project teams change, some users may no longer need access. However, if project offboarding does not include Cloud Foundry org and space membership cleanup, stale access can remain.</P><P>Manually validating this from the SAP BTP cockpit requires going through each subaccount, org, and space one by one. In my case, this could take close to a full business day.</P><P><FONT color="#0000FF"><EM><STRONG>Tools Used</STRONG></EM></FONT></P><P>I used the following command-line tools:</P><OL><LI>SAP BTP CLI&nbsp; -The SAP BTP CLI is used for SAP BTP account administration, including working with global accounts, subaccounts, and environment instances.</LI><LI>Cloud Foundry CLI -&nbsp;The Cloud Foundry CLI is used to interact with the SAP BTP Cloud Foundry runtime, including orgs, spaces, applications, services, and users.</LI></OL><DIV><FONT color="#0000FF"><EM><STRONG>High-Level Approach</STRONG></EM></FONT><DIV>&nbsp;<DIV>The automation was split into two steps.</DIV><DIV>&nbsp;</DIV><DIV><DIV><STRONG>Step 1: Identify Cloud Foundry API Endpoints -&nbsp;</STRONG><SPAN>First, I used the SAP BTP CLI to list subaccounts and environment instances. Then, for each subaccount, lists environment instances of a subaccount, such as Cloud Foundry orgs or Kyma clusters.</SPAN></DIV><DIV>&nbsp;</DIV><DIV><SPAN>From this output, I identified the Cloud Foundry API endpoints used in the global account.&nbsp;</SPAN></DIV><DIV><SPAN>Example endpoints:</SPAN></DIV></DIV></DIV></DIV></DIV></DIV><pre class="lia-code-sample language-python"><code>https://api.cf.eu10-004.hana.ondemand.com https://api.cf.us10-001.hana.ondemand.com https://api.cf.us20.hana.ondemand.com https://api.cf.us21.hana.ondemand.com</code></pre><P><STRONG>Step 2: Extract Org and Space Members -&nbsp;</STRONG>After collecting the API endpoints, I used the Cloud Foundry CLI to log in to each endpoint and extract:</P><P class="lia-indent-padding-left-60px" style="padding-left : 60px;">Organizations<BR />Spaces<BR />Org-level role assignments<BR />Space-level role assignments<BR />User details<BR />Role details</P><P>The script loops through each endpoint, retrieves all orgs, then retrieves spaces and role assignments for each org.</P><P><FONT color="#0000FF"><EM><STRONG>Why Include Both Org and Space Roles?</STRONG></EM></FONT></P><P>Initially, I focused only on org members. However, that did not give the complete access picture.<BR />A user may not have a high-privilege org role but may still be assigned as a Space Developer or Space Manager in one or more spaces. For access review purposes, both org-level and space-level assignments are important.</P><P><FONT color="#0000FF"><EM><STRONG>Conclusion</STRONG></EM></FONT></P><P>Automating Cloud Foundry org and space membership extraction helped reduce a repetitive manual review process from almost a full business day to a few minutes.<BR />The consolidated CSV output provides a clear view of users maintained at org and space levels across multiple SAP BTP Cloud Foundry endpoints. This makes access review faster, more consistent, and easier to repeat.<BR />For teams managing multiple SAP BTP subaccounts, this type of automation can be a useful starting point for improving visibility into Cloud Foundry access.</P><P><FONT color="#0000FF"><EM><STRONG>How to Run the Automation</STRONG></EM></FONT></P><P>This section explains the practical steps to run the automation and generate the final Cloud Foundry org/space membership report.</P><P><BR /><STRONG>Prerequisites</STRONG><BR />Before running the scripts, ensure the following tools are installed and accessible from PowerShell:</P><UL><LI>SAP BTP CLI</LI><LI>Cloud Foundry CLI</LI><LI>PowerShell</LI><LI>Access to the SAP BTP global account/subaccounts</LI><LI>Access to Cloud Foundry endpoints through SSO</LI></UL><P>Validate the CLI installations:</P><pre class="lia-code-sample language-python"><code>btp --version cf version</code></pre><P>If btp or cf is not recognized, add the CLI installation folder to the system/user PATH or call the executable using the full path.</P><pre class="lia-code-sample language-abap"><code>$env:Path += ";C:\BTP"</code></pre><P><STRONG>Step 1: Log in to SAP BTP CLI</STRONG><BR />Log in to the SAP BTP global account:</P><pre class="lia-code-sample language-python"><code>btp login</code></pre><P>Confirm the current BTP target:</P><pre class="lia-code-sample language-python"><code>btp target</code></pre><P>The target should point to the intended global account before continuing.</P><P><STRONG>Step 2: Extract Cloud Foundry API Endpoints<BR /></STRONG>Run the endpoint discovery script:</P><pre class="lia-code-sample language-python"><code>cd C:\BTP .\get-all-cf-api-endpoints.ps1</code></pre><P>This script identifies Cloud Foundry-enabled subaccounts and generates two output files:</P><pre class="lia-code-sample language-python"><code>C:\BTP\btp-cf-api-endpoints-by-subaccount.csv C:\BTP\btp-cf-api-endpoints-unique.txt</code></pre><P>The detailed CSV contains subaccount-level details, while the unique text file contains the distinct Cloud Foundry API endpoints.</P><P><STRONG>Step 3: Update the Endpoint List in the Extraction Script(export-org-and-space-members-multiple-endpoints.ps1)<BR /></STRONG>Open the org/space member extraction script:</P><pre class="lia-code-sample language-python"><code>notepad C:\BTP\export-org-and-space-members-multiple-endpoints.ps1</code></pre><P>Update the $Endpoints array with the API endpoints identified in Step 2.</P><P>Example:</P><pre class="lia-code-sample language-markup"><code>$Endpoints = @( "https://api.cf.eu10-004.hana.ondemand.com", "https://api.cf.us10-001.hana.ondemand.com", "https://api.cf.us20.hana.ondemand.com", "https://api.cf.us21.hana.ondemand.com" )</code></pre><P><STRONG>Step 4: Run the Org and Space Membership Extraction<BR /></STRONG>Run the script:</P><pre class="lia-code-sample language-python"><code>cd C:\BTP .\export-org-and-space-members-multiple-endpoints.ps1</code></pre><P>For each endpoint, the script will display a passcode URL similar to:</P><pre class="lia-code-sample language-python"><code>https://login.cf.us21.hana.ondemand.com/passcode</code></pre><P>Open the displayed URL in a browser, copy the temporary SSO passcode, paste it into the PowerShell prompt, and press Enter.<BR />The script repeats this process for each Cloud Foundry API endpoint.</P><P><STRONG>Step 5: Review the Output File<BR /></STRONG>After the script completes, it generates a consolidated CSV report:</P><pre class="lia-code-sample language-python"><code>C:\BTP\all-cf-endpoint-org-space-members.csv</code></pre><P><STRONG>============================================================================<BR /><FONT color="#800000"><STRONG>get-all-cf-api-endpoints.ps1 Source Code<BR /><STRONG>============================================================================</STRONG></STRONG></FONT></STRONG></P><pre class="lia-code-sample language-python"><code># ============================================================ # Get all Cloud Foundry API endpoints from all BTP subaccounts # Output: # C:\BTP\btp-cf-api-endpoints-by-subaccount.csv # C:\BTP\btp-cf-api-endpoints-unique.txt # # Prerequisite: # Already logged in using: btp login # ============================================================ $DetailOutFile = "C:\BTP\btp-cf-api-endpoints-by-subaccount.csv" $UniqueOutFile = "C:\BTP\btp-cf-api-endpoints-unique.txt" $Results = @() function Get-JsonArray { param($JsonObject) if ($null -eq $JsonObject) { return @() } if ($JsonObject -is [System.Array]) { return @($JsonObject) } foreach ($prop in @("value", "items", "content", "subaccounts", "environmentInstances", "resources")) { if ($JsonObject.PSObject.Properties.Name -contains $prop) { return @($JsonObject.$prop) } } return @($JsonObject) } function Get-FirstPropertyValue { param( $Object, [string[]]$PropertyNames ) if ($null -eq $Object) { return $null } foreach ($name in $PropertyNames) { if ($Object.PSObject.Properties.Name -contains $name) { $value = $Object.$name if ($null -ne $value -and "$value".Trim() -ne "") { return "$value" } } } return $null } function Get-CfApiEndpointFromObject { param( $EnvObject, [string]$SubaccountRegion ) # 1. Try to find a full API endpoint directly in the JSON. $jsonText = $EnvObject | ConvertTo-Json -Depth 30 -Compress if ($jsonText -match "https://api\.cf\.[a-zA-Z0-9-]+\.hana\.ondemand\.com") { return $Matches[0] } # 2. Try to derive from landscape label or region. $candidateValues = @() $landscape = Get-FirstPropertyValue $EnvObject @( "landscapeLabel", "landscape", "landscape_label", "platformId", "platform_id", "region" ) if ($landscape) { $candidateValues += $landscape } if ($SubaccountRegion) { $candidateValues += $SubaccountRegion } foreach ($candidate in $candidateValues) { if (-not $candidate) { continue } $value = "$candidate".Trim() # Examples: # cf-us21 -&gt; us21 # cf-us21-001 -&gt; us21 # us21 -&gt; us21 # us21-001 -&gt; us21 if ($value -match "^cf[-_](?&lt;region&gt;[a-z]{2}[0-9]{2})(?:[-_][0-9]+)?$") { return "https://api.cf.$($Matches.region).hana.ondemand.com" } if ($value -match "^(?&lt;region&gt;[a-z]{2}[0-9]{2})(?:[-_][0-9]+)?$") { return "https://api.cf.$($Matches.region).hana.ondemand.com" } } return $null } Write-Host "Getting subaccounts from current BTP global account..." -ForegroundColor Cyan $subRaw = btp --format json list accounts/subaccount if ($LASTEXITCODE -ne 0) { Write-Host "Failed to list subaccounts. Confirm you are logged in with btp login." -ForegroundColor Red exit 1 } $subJson = $subRaw | ConvertFrom-Json $subaccounts = Get-JsonArray $subJson Write-Host "Found $($subaccounts.Count) subaccount record(s)." -ForegroundColor Green foreach ($sub in $subaccounts) { $subaccountId = Get-FirstPropertyValue $sub @( "guid", "id", "subaccountId", "subaccountGuid", "subaccountGUID", "subaccount id" ) $subaccountName = Get-FirstPropertyValue $sub @( "displayName", "display name", "name" ) $subdomain = Get-FirstPropertyValue $sub @( "subdomain" ) $region = Get-FirstPropertyValue $sub @( "region" ) if (-not $subaccountId) { Write-Host "Skipping subaccount record because no subaccount ID was found." -ForegroundColor Yellow continue } Write-Host "`nChecking subaccount: $subaccountName [$subaccountId]" -ForegroundColor Yellow try { $envRaw = btp --format json list accounts/environment-instance --subaccount $subaccountId if ($LASTEXITCODE -ne 0) { $Results += [PSCustomObject]@{ SubaccountName = $subaccountName SubaccountId = $subaccountId Subdomain = $subdomain Region = $region Environment = "" EnvironmentId = "" CfApiEndpoint = "" Status = "Error listing environment instances" } continue } $envJson = $envRaw | ConvertFrom-Json $envInstances = Get-JsonArray $envJson if (-not $envInstances -or $envInstances.Count -eq 0) { $Results += [PSCustomObject]@{ SubaccountName = $subaccountName SubaccountId = $subaccountId Subdomain = $subdomain Region = $region Environment = "" EnvironmentId = "" CfApiEndpoint = "" Status = "No environment instances" } continue } foreach ($env in $envInstances) { $envText = ($env | ConvertTo-Json -Depth 30 -Compress) $isCloudFoundry = $envText -match "cloudfoundry" -or $envText -match "Cloud Foundry" -or $envText -match "cloud foundry" if (-not $isCloudFoundry) { continue } $envName = Get-FirstPropertyValue $env @( "name", "displayName", "environment", "environmentType", "serviceName", "service" ) $envId = Get-FirstPropertyValue $env @( "id", "guid", "environmentInstanceId" ) $endpoint = Get-CfApiEndpointFromObject -EnvObject $env -SubaccountRegion $region $Results += [PSCustomObject]@{ SubaccountName = $subaccountName SubaccountId = $subaccountId Subdomain = $subdomain Region = $region Environment = $envName EnvironmentId = $envId CfApiEndpoint = $endpoint Status = if ($endpoint) { "Found" } else { "Cloud Foundry found, endpoint not derived" } } } } catch { $Results += [PSCustomObject]@{ SubaccountName = $subaccountName SubaccountId = $subaccountId Subdomain = $subdomain Region = $region Environment = "" EnvironmentId = "" CfApiEndpoint = "" Status = "Error: $($_.Exception.Message)" } } } $Results | Sort-Object SubaccountName, CfApiEndpoint | Export-Csv -Path $DetailOutFile -NoTypeInformation $Results | Where-Object { $_.CfApiEndpoint -and $_.CfApiEndpoint.Trim() -ne "" } | Select-Object -ExpandProperty CfApiEndpoint -Unique | Sort-Object | Set-Content -Path $UniqueOutFile Write-Host "`nDone." -ForegroundColor Green Write-Host "Detailed output: $DetailOutFile" -ForegroundColor Green Write-Host "Unique endpoints: $UniqueOutFile" -ForegroundColor Green</code></pre><P><STRONG>============================================================================<BR /><FONT color="#800000"><STRONG>export-org-and-space-members-multiple-endpoints.ps1 Source Code<BR /><STRONG>============================================================================</STRONG></STRONG></FONT></STRONG></P><pre class="lia-code-sample language-python"><code># ============================================================ # Export Cloud Foundry org + space members from multiple endpoints # Output: C:\BTP\all-cf-endpoint-org-space-members.csv # # Safety: # READ-ONLY against Cloud Foundry. # Uses cf login and cf curl GET requests only. # ============================================================ $OutFile = "C:\BTP\all-cf-endpoint-org-space-members.csv" $Endpoints = @( "https://api.cf.eu10-004.hana.ondemand.com", "https://api.cf.us10-001.hana.ondemand.com", "https://api.cf.us20.hana.ondemand.com", "https://api.cf.us21.hana.ondemand.com" ) $Results = @() function Get-LoginHostFromApiEndpoint { param([string]$Endpoint) return ($Endpoint -replace "^https://api\.", "https://login.") + "/passcode" } function Invoke-CfGetPaged { param([string]$Path) $AllResources = @() $AllIncludedUsers = @() $NextPath = $Path while ($NextPath) { $Raw = cf curl $NextPath if ($LASTEXITCODE -ne 0) { throw "cf curl failed for path: $NextPath" } $Json = $Raw | ConvertFrom-Json if ($Json.resources) { $AllResources += $Json.resources } if ($Json.included -and $Json.included.users) { $AllIncludedUsers += $Json.included.users } if ($Json.pagination -and $Json.pagination.next -and $Json.pagination.next.href) { $NextHref = $Json.pagination.next.href if ($NextHref -like "http*") { $Uri = [System.Uri]$NextHref $NextPath = $Uri.PathAndQuery } else { $NextPath = $NextHref } } else { $NextPath = $null } } return [PSCustomObject]@{ Resources = $AllResources Users = $AllIncludedUsers } } function Convert-CfRoleName { param([string]$Role) switch ($Role) { "organization_manager" { return "Org Manager" } "organization_auditor" { return "Org Auditor" } "organization_user" { return "Org User" } "organization_billing_manager" { return "Billing Manager" } "space_manager" { return "Space Manager" } "space_developer" { return "Space Developer" } "space_auditor" { return "Space Auditor" } "space_supporter" { return "Space Supporter" } default { return $Role } } } function Get-UserDetailsFromRoleResponse { param( $RoleResponse ) $UsersByGuid = @{} foreach ($User in $RoleResponse.Users) { if ($User.guid -and -not $UsersByGuid.ContainsKey($User.guid)) { $UsersByGuid[$User.guid] = $User } } return $UsersByGuid } function Get-UserGuidFromRole { param($Role) if ($Role.relationships -and $Role.relationships.user -and $Role.relationships.user.data -and $Role.relationships.user.data.guid) { return $Role.relationships.user.data.guid } return $null } Write-Host "SCRIPT STARTED: Export org + space members from multiple CF endpoints" -ForegroundColor Cyan Write-Host "Output file: $OutFile" -ForegroundColor Cyan foreach ($Endpoint in $Endpoints) { Write-Host "`n============================================================" -ForegroundColor Cyan Write-Host "Processing endpoint: $Endpoint" -ForegroundColor Cyan Write-Host "============================================================" -ForegroundColor Cyan $PasscodeUrl = Get-LoginHostFromApiEndpoint -Endpoint $Endpoint Write-Host "`nOpen this URL in browser and copy a fresh SSO passcode:" -ForegroundColor Yellow Write-Host $PasscodeUrl -ForegroundColor White $Passcode = Read-Host "Enter SSO passcode for $Endpoint" if ([string]::IsNullOrWhiteSpace($Passcode)) { Write-Host "No passcode entered. Skipping endpoint: $Endpoint" -ForegroundColor Red $Results += [PSCustomObject]@{ Endpoint = $Endpoint OrgName = "" OrgGuid = "" SpaceName = "" SpaceGuid = "" Email = "" Origin = "" OrgRoles = "" SpaceRoles = "" Status = "Skipped - no SSO passcode entered" } continue } Write-Host "Logging in to $Endpoint ..." -ForegroundColor Cyan cf login -a $Endpoint --sso-passcode $Passcode if ($LASTEXITCODE -ne 0) { Write-Host "Login failed for endpoint: $Endpoint" -ForegroundColor Red $Results += [PSCustomObject]@{ Endpoint = $Endpoint OrgName = "" OrgGuid = "" SpaceName = "" SpaceGuid = "" Email = "" Origin = "" OrgRoles = "" SpaceRoles = "" Status = "Login failed" } continue } try { Write-Host "Getting organizations from $Endpoint ..." -ForegroundColor Cyan $OrgResponse = Invoke-CfGetPaged "/v3/organizations?per_page=5000" $Orgs = $OrgResponse.Resources if (-not $Orgs -or $Orgs.Count -eq 0) { $Results += [PSCustomObject]@{ Endpoint = $Endpoint OrgName = "" OrgGuid = "" SpaceName = "" SpaceGuid = "" Email = "" Origin = "" OrgRoles = "" SpaceRoles = "" Status = "No orgs found or no org access" } continue } foreach ($Org in $Orgs) { $OrgName = $Org.name $OrgGuid = $Org.guid Write-Host "`nProcessing org: $OrgName" -ForegroundColor Yellow # ------------------------------------------------------------ # 1. Get org-level members and roles # ------------------------------------------------------------ $OrgUserRoleMap = @{} $OrgUserOriginMap = @{} try { $OrgRoleResponse = Invoke-CfGetPaged "/v3/roles?organization_guids=$OrgGuid&amp;include=user&amp;per_page=5000" $OrgRoles = $OrgRoleResponse.Resources $OrgUsersByGuid = Get-UserDetailsFromRoleResponse -RoleResponse $OrgRoleResponse foreach ($Role in $OrgRoles) { if ($Role.type -notlike "organization_*") { continue } $UserGuid = Get-UserGuidFromRole -Role $Role if (-not $UserGuid) { continue } $UserObj = $OrgUsersByGuid[$UserGuid] if ($UserObj) { $Email = $UserObj.username $Origin = $UserObj.origin } else { $Email = $UserGuid $Origin = "User details not included" } if (-not $OrgUserRoleMap.ContainsKey($Email)) { $OrgUserRoleMap[$Email] = @() } $OrgUserRoleMap[$Email] += Convert-CfRoleName $Role.type $OrgUserOriginMap[$Email] = $Origin } } catch { $Results += [PSCustomObject]@{ Endpoint = $Endpoint OrgName = $OrgName OrgGuid = $OrgGuid SpaceName = "" SpaceGuid = "" Email = "" Origin = "" OrgRoles = "" SpaceRoles = "" Status = "Error getting org roles: $($_.Exception.Message)" } } # Add org-level rows where no specific space is attached foreach ($Email in $OrgUserRoleMap.Keys) { $OrgRolesText = ($OrgUserRoleMap[$Email] | Sort-Object -Unique) -join ", " $Results += [PSCustomObject]@{ Endpoint = $Endpoint OrgName = $OrgName OrgGuid = $OrgGuid SpaceName = "" SpaceGuid = "" Email = $Email Origin = $OrgUserOriginMap[$Email] OrgRoles = $OrgRolesText SpaceRoles = "" Status = "Org-level member" } } # ------------------------------------------------------------ # 2. Get spaces under this org # ------------------------------------------------------------ try { $SpacesResponse = Invoke-CfGetPaged "/v3/spaces?organization_guids=$OrgGuid&amp;per_page=5000" $Spaces = $SpacesResponse.Resources if (-not $Spaces -or $Spaces.Count -eq 0) { continue } foreach ($Space in $Spaces) { $SpaceName = $Space.name $SpaceGuid = $Space.guid Write-Host "Processing space members: $OrgName / $SpaceName" -ForegroundColor Gray try { $SpaceRoleResponse = Invoke-CfGetPaged "/v3/roles?space_guids=$SpaceGuid&amp;include=user&amp;per_page=5000" $SpaceRoles = $SpaceRoleResponse.Resources $SpaceUsersByGuid = Get-UserDetailsFromRoleResponse -RoleResponse $SpaceRoleResponse if (-not $SpaceRoles -or $SpaceRoles.Count -eq 0) { $Results += [PSCustomObject]@{ Endpoint = $Endpoint OrgName = $OrgName OrgGuid = $OrgGuid SpaceName = $SpaceName SpaceGuid = $SpaceGuid Email = "" Origin = "" OrgRoles = "" SpaceRoles = "" Status = "No space members found" } continue } $SpaceUserRoleMap = @{} $SpaceUserOriginMap = @{} foreach ($Role in $SpaceRoles) { if ($Role.type -notlike "space_*") { continue } $UserGuid = Get-UserGuidFromRole -Role $Role if (-not $UserGuid) { continue } $UserObj = $SpaceUsersByGuid[$UserGuid] if ($UserObj) { $Email = $UserObj.username $Origin = $UserObj.origin } else { $Email = $UserGuid $Origin = "User details not included" } if (-not $SpaceUserRoleMap.ContainsKey($Email)) { $SpaceUserRoleMap[$Email] = @() } $SpaceUserRoleMap[$Email] += Convert-CfRoleName $Role.type $SpaceUserOriginMap[$Email] = $Origin } foreach ($Email in $SpaceUserRoleMap.Keys) { $SpaceRolesText = ($SpaceUserRoleMap[$Email] | Sort-Object -Unique) -join ", " $OrgRolesText = "" if ($OrgUserRoleMap.ContainsKey($Email)) { $OrgRolesText = ($OrgUserRoleMap[$Email] | Sort-Object -Unique) -join ", " } $Origin = $SpaceUserOriginMap[$Email] if (-not $Origin -and $OrgUserOriginMap.ContainsKey($Email)) { $Origin = $OrgUserOriginMap[$Email] } $Results += [PSCustomObject]@{ Endpoint = $Endpoint OrgName = $OrgName OrgGuid = $OrgGuid SpaceName = $SpaceName SpaceGuid = $SpaceGuid Email = $Email Origin = $Origin OrgRoles = $OrgRolesText SpaceRoles = $SpaceRolesText Status = "Space-level member" } } } catch { $Results += [PSCustomObject]@{ Endpoint = $Endpoint OrgName = $OrgName OrgGuid = $OrgGuid SpaceName = $SpaceName SpaceGuid = $SpaceGuid Email = "" Origin = "" OrgRoles = "" SpaceRoles = "" Status = "Error getting space members: $($_.Exception.Message)" } } } } catch { $Results += [PSCustomObject]@{ Endpoint = $Endpoint OrgName = $OrgName OrgGuid = $OrgGuid SpaceName = "" SpaceGuid = "" Email = "" Origin = "" OrgRoles = "" SpaceRoles = "" Status = "Error getting spaces: $($_.Exception.Message)" } } } } catch { $Results += [PSCustomObject]@{ Endpoint = $Endpoint OrgName = "" OrgGuid = "" SpaceName = "" SpaceGuid = "" Email = "" Origin = "" OrgRoles = "" SpaceRoles = "" Status = "Error getting orgs: $($_.Exception.Message)" } } } $Results | Sort-Object Endpoint, OrgName, SpaceName, Email | Export-Csv -Path $OutFile -NoTypeInformation Write-Host "`nExport completed." -ForegroundColor Green Write-Host "File created: $OutFile" -ForegroundColor Green Write-Host "Open with:" -ForegroundColor Cyan Write-Host "notepad $OutFile" -ForegroundColor White</code></pre><P>&nbsp;</P> 2026-05-11T16:23:58.128000+02:00 https://community.sap.com/t5/customer-experience-learning-group-blog-posts/new-course-announcement-getting-started-with-sap-enterprise-consent-and/ba-p/14395585 New Course Announcement: Getting Started with SAP Enterprise Consent and Preference Management 2026-05-13T18:51:35.377000+02:00 KatJankovic https://community.sap.com/t5/user/viewprofilepage/user-id/160268 <P>We’re excited to introduce a new course in the SAP Customer Data Cloud learning portfolio:</P><H2 id="toc-hId-1796079302"><A href="https://learning.sap.com/courses/getting-started-with-sap-enterprise-consent-and-preference-management" target="_self" rel="noopener noreferrer"><STRONG>Getting Started with SAP Enterprise Consent and Preference Management</STRONG></A></H2><P>This course is the next step in your journey after completing<BR /><A href="https://learning.sap.com/courses/mastering-sap-customer-identity-and-access-management?searchId=27f564d7-cda6-4c32-a949-2d0f016decd0&amp;listPosition=1" target="_self" rel="noopener noreferrer">Mastering SAP Customer Identity and Access Management</A>&nbsp;</P><P>Together, these courses form part of a comprehensive learning experience designed to guide you through the full implementation of SAP Customer Data Cloud.</P><HR /><H2 id="toc-hId-1599565797">&nbsp;Part of a Complete Learning Journey</H2><DIV><P>This course is part of a broader enablement plan for SAP Customer Data Cloud.</P><P><span class="lia-unicode-emoji" title=":warning:">⚠️</span><STRONG>Note:</STRONG> This course will soon be officially included in <A href="https://learning.sap.com/learning-journeys/implementing-sap-customer-data-cloud?searchId=6c665bb3-596b-41fb-b129-6afb036ab50a&amp;listPosition=1" target="_self" rel="noopener noreferrer">this</A> Learning Journey.</P><P>Once fully released, the learning journey will contain&nbsp;<STRONG>four new complementary courses</STRONG>, covering the complete scope of the instructor-led training (ILT):</P><P><A href="https://training.sap.com/course/c4h62-sap-customer-data-cloud-implementation-remoteclassroom-054-de-en?" target="_self" rel="noopener noreferrer">SAP Customer Data Cloud Implementation</A></P><P>These courses collectively guide you through identity, access, consent, and advanced configuration topics—providing a complete end-to-end learning experience.</P></DIV><HR /><H2 id="toc-hId-1403052292">Who Should Take This Course?</H2><P>This course is designed for:</P><UL><LI><STRONG>Customer data professionals (intermediate level)</STRONG>&nbsp;</LI><LI>Consultants and practitioners working with customer data platforms</LI><LI>Professionals responsible for <STRONG>privacy, compliance, and consent management</STRONG></LI></UL><P>If you’re already familiar with identity and access management concepts, this course will help you extend your expertise into <STRONG>privacy and preference management</STRONG>.</P><HR /><H2 id="toc-hId-1206538787">What You’ll Learn</H2><P>In today’s privacy-first world, managing consent is critical. This course provides a <STRONG>practical, hands-on introduction</STRONG> to SAP Enterprise Consent and Preference Management capabilities.</P><P>By the end of the course, you’ll be able to:</P><UL><LI>Understand global <STRONG>privacy regulations</STRONG> (e.g., GDPR, CCPA) and their impact&nbsp;</LI><LI>Configure and manage <STRONG>customer consent using SAP Customer Consent</STRONG></LI><LI>Apply <STRONG>version control</STRONG> to ensure valid and up-to-date consent records&nbsp;</LI><LI>Use the <STRONG>Consent Vault</STRONG> to track, audit, and report consent activity&nbsp;</LI><LI>Set up and customize a <STRONG>Self-Service Preference Center</STRONG> for end users <A href="https://sap-my.sharepoint.com/personal/katarina_jankovic_sap_com/_layouts/15/Doc.aspx?sourcedoc=%7BF18987A4-19AF-4B1E-B4DC-42F40031F4DE%7D&amp;file=C4H72%20Content%20Plan.docx&amp;action=default&amp;mobileredirect=true" target="_blank" rel="noopener nofollow noreferrer">[</A></LI><LI>Define and manage <STRONG>communication channels and topics</STRONG> to personalize user preferences&nbsp;</LI></UL><P>Ultimately, you’ll gain the skills to implement <STRONG>enterprise-grade consent strategies</STRONG> that support compliance while enabling trusted customer engagement.</P><HR /><H2 id="toc-hId-1010025282">&nbsp;Course Highlights</H2><P>The course is structured into three practical units:</P><H3 id="toc-hId-942594496">1. Foundations of Customer Consent Management</H3><UL><LI>Key regulations and compliance requirements</LI><LI>Core principles of consent and user rights</LI></UL><H3 id="toc-hId-746080991">2. Managing Consent with SAP Customer Data Cloud</H3><UL><LI>SAP Customer Consent capabilities</LI><LI>Version control and consent lifecycle</LI><LI>Consent Vault for auditing and reporting</LI><LI>Self-Service Preference Center configuration</LI></UL><H3 id="toc-hId-549567486">3. Communication Preferences and Personalization</H3><UL><LI>Communication channels and topics</LI><LI>Subscription management and user choice</LI></UL><HR /><H2 id="toc-hId-223971262"><span class="lia-unicode-emoji" title=":link:">🔗</span>Prerequisite Course</H2><P>Before taking this course, we strongly recommend completing:</P><P><A href="https://learning.sap.com/courses/mastering-sap-customer-identity-and-access-management?searchId=e57469fb-5536-44c0-ad0c-1d4d3be5fee6&amp;listPosition=1" target="_self" rel="noopener noreferrer">&nbsp;<STRONG>Mastering SAP Customer Identity and Access Management</STRONG></A><BR />This foundational course introduces identity concepts and prepares you to fully understand consent and preference management within SAP Customer Data Cloud.</P><HR /><H2 id="toc-hId-27457757">Why This Course Matters</H2><P>As organizations operate across global markets, <STRONG>compliance with privacy regulations is no longer optional</STRONG>. Customers expect transparency, control, and trust.</P><P>With SAP Enterprise Consent and Preference Management, you can:</P><UL><LI>Ensure regulatory compliance</LI><LI>Build <STRONG>trust-based digital relationships</STRONG></LI><LI>Deliver <STRONG>personalized yet privacy-aware experiences</STRONG></LI></UL><P>This course equips you with the knowledge and practical skills to make that happen.</P><HR /><H2 id="toc-hId-178198609">Start Learning Today</H2><P><STRONG>Enroll now:</STRONG><BR /><A href="https://learning.sap.com/courses/getting-started-with-sap-enterprise-consent-and-preference-management?searchId=65e2c3d1-9dec-40b6-a933-b71e06bc66fb&amp;listPosition=1" target="_self" rel="noreferrer noopener">Getting Started with SAP Enterprise Consent and Preference Management</A></P><P><STRONG>Stay tuned—more CIAM courses are coming soon.</STRONG></P><P>&nbsp;</P> 2026-05-13T18:51:35.377000+02:00 https://community.sap.com/t5/technology-blog-posts-by-sap/secure-by-design-how-sap-and-nvidia-are-redefining-agent-execution/ba-p/14406128 Secure by Design: How SAP and NVIDIA Are Redefining Agent Execution 2026-06-01T07:50:00.019000+02:00 ratulshah https://community.sap.com/t5/user/viewprofilepage/user-id/604338 <P><SPAN>I am still reveling in the excitement of SAP Sapphire Orlando, May 11 to May 13, 2026.&nbsp; It started with the&nbsp;SAP <A href="https://www.youtube.com/watch?v=9aa-etRsaLU" target="_blank" rel="noopener nofollow noreferrer">keynote ,</A> highlighting our future direction.&nbsp; A personal moment of pride filled the screens around minute 42, when the CEO of NVIDIA Jensen Huang introduced how SAP and NVIDIA are making enterprise software more powerful and security. </SPAN></P><P><SPAN>&nbsp;</SPAN><SPAN>On Wednesday, I hosted a strategy talk between Sebastian Mahr, Chief Development Architect, SAP SE and Shahriar Hooshmand, GenAI Technical Lead, NVIDIA.&nbsp; Today, I am sharing more details about their discussion for redefining agent execution. The AI first experience for building happens in <A href="https://www.sap.com/products/artificial-intelligence/joule-studio.html" target="_blank" rel="noopener noreferrer">Joule Studio</A> and Joule Studio runtime with NVIDIA makes it easy to deploy and secure for enterprise scale. </SPAN></P><P><SPAN>AI agents are moving from conversation to action. They are beginning to execute tasks, invoke tools, cross system boundaries, and operate inside the business processes where decisions are made and value is created. For enterprises, this changes the trust equation. A chatbot can suggest; an agent can act. And once agents can engage with systems of record across finance, procurement, supply chain, manufacturing, and customer operations, the question becomes much sharper: how do we safely deploy autonomous AI? SAP and NVIDIA’s collaboration is designed to answer exactly that question. The SAP Business AI Platform uses the NVIDIA OpenShell secure runtime to make agents safe, governable, and auditable by design. Joule Studio acts as an "agent harness" that combines Large Language Model intelligence with business data and domain expertise.</SPAN></P><P><STRONG>Autonomy, Intelligence, and Security</STRONG></P><P><SPAN>Every enterprise agent sits in a tension between <STRONG>Autonomy</STRONG>, <STRONG>Intelligence</STRONG>, and <STRONG>Security</STRONG>. Highly autonomous agents can move fast, intelligent agents can reason through complex business contexts, and secure agents can operate within clear technical and business boundaries. In real-world enterprise environments, you cannot simply maximize all three at once. A loan-processing agent, a production-line response agent, and a strategic planning agent should not run with the same level of freedom, the same approval model, or the same risk posture. The more autonomous the agent, the more important it becomes to define what it can see, what it can do, who approves its actions, and how those actions are traced.</SPAN></P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="ratulshah_0-1779986145025.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/415164iADEA03266F1B2B27/image-size/medium?v=v2&amp;px=400" role="button" title="ratulshah_0-1779986145025.png" alt="ratulshah_0-1779986145025.png" /></span></P><P>&nbsp;</P><P><STRONG><SPAN>Responsibility</SPAN></STRONG><SPAN> and secure execution must become the layer around agentic enterprise AI. Security is about container isolation, credentials, networks, APIs and risk management for unauthorized spending, compliance violations, reputational damage, liability, and audit readiness. Enterprises need a way to choose the right balance for each workload: </SPAN></P><UL><LI><SPAN>Autonomous and secure for repeatable tasks, </SPAN></LI><LI><SPAN>Intelligent and secure for high-context work with human oversight, or </SPAN></LI><LI><SPAN>Autonomous and intelligent only in tightly controlled development and testing environments. </SPAN></LI></UL><P><SPAN>Responsibility defines who decides the operating mode, who bears the risk, and how the system adapts as the workload becomes more capable or more sensitive.</SPAN></P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="ratulshah_1-1779986145030.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/415166i962A516662D4D927/image-size/medium?v=v2&amp;px=400" role="button" title="ratulshah_1-1779986145030.png" alt="ratulshah_1-1779986145030.png" /></span></P><P>&nbsp;</P><P><SPAN>In <A href="https://www.sap.com/products/artificial-intelligence/joule-studio.html#managed-runtime" target="_blank" rel="noopener noreferrer">Joule Studio runtime</A>, NVIDIA OpenShell provides the secure runtime foundation for agent execution, including isolated environments, filesystem and network policy enforcement, and runtime-level containment to limit impact if agent logic fails. SAP brings the enterprise context: roles, skills, identity, lifecycle, policy semantics, observability, auditability, and governance across business landscapes. Put simply, OpenShell helps answer, “<EM>Can this agent action safely execute?</EM>” Joule Studio runtime helps answer, “<EM>Should this action happen at all?</EM>” Together, they close the gap between technical containment and business accountability.</SPAN></P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="ratulshah_2-1779986145031.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/415165i188D16D3B1ABB91E/image-size/medium?v=v2&amp;px=400" role="button" title="ratulshah_2-1779986145031.png" alt="ratulshah_2-1779986145031.png" /></span></P><P>&nbsp;</P><P><SPAN>The SAP and NVIDIA collaboration, which includes SAP as a key contributor to the NVIDIA OpenShell open source project, also reflects NVIDIA's broader full-stack view of AI. NVIDIA’s founder and CEO, Jensen Huang, has framed AI as a <A href="https://blogs.nvidia.com/blog/ai-5-layer-cake/" target="_blank" rel="noopener nofollow noreferrer">five-layer stack</A>;&nbsp; energy, chips, infrastructure, models, and applications; the application layer is where AI creates value in real workflows. For SAP customers, that point matters. Enterprise AI becomes real when agents can operate inside the business applications, identities, policies, and audit models that companies already depend on. SAP and NVIDIA’s work on <A href="https://www.sap.com/products/artificial-intelligence/joule-studio.html#managed-runtime" target="_blank" rel="noopener noreferrer">Joule Studio runtime</A> is about making that next step practical: allowing agents to act, while staying within the boundaries enterprises require.</SPAN></P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="ratulshah_3-1779986145033.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/415167i23A2F691CFC9311E/image-size/medium?v=v2&amp;px=400" role="button" title="ratulshah_3-1779986145033.png" alt="ratulshah_3-1779986145033.png" /></span></P><P>&nbsp;</P><P><SPAN>This week at Computex / GTC Taipei, NVIDIA is announcing new open source software and models to continue making it easier to build and deploy autonomous agents. And now, the next step is to put this into the hands of builders. SAP customers and partners building custom agents should engage with the new <STRONG><A href="https://www.sap.com/campaigns/nl/joule-studio" target="_blank" rel="noopener noreferrer">Joule Studio early access / Early Adopter Program</A></STRONG> to start shaping their own trusted agent execution model. Explore how SAP enterprise with OpenShell-based runtime security and governance powered by OpenShell can help you understand your security posture, define workload-specific risk profiles, and move from pilots to production with confidence. Autonomous enterprise is no longer only a vision. With SAP and NVIDIA working together on secure, responsible agent execution, it is beginning now.</SPAN></P><P><SPAN>Now is the time to <A href="https://www.sap.com/campaigns/nl/joule-studio" target="_blank" rel="noopener noreferrer">get in line</A>.</SPAN></P> 2026-06-01T07:50:00.019000+02:00 https://community.sap.com/t5/technology-blog-posts-by-sap/generative-ai-hub-governance-controlling-foundation-model-access-on-sap-btp/ba-p/14387277 Generative AI Hub Governance: Controlling Foundation Model Access on SAP BTP 2026-06-01T23:45:41.581000+02:00 felixbartler https://community.sap.com/t5/user/viewprofilepage/user-id/4997 <P>When you provision SAP AI Core's Generative AI Hub, you get access to dozens of foundation models through a single orchestration endpoint. One service key, all of OpenAI, Anthropic, Google, Meta — ready to go. That works fine for a single team or a proof of concept, but as soon as multiple departments want access, questions arise: who is allowed to administer the tenant, use which models, how much can they spend, and can you enforce content safety centrally?</P><P><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="scenario.jpg" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/417099i3430132F7A27ABEF/image-size/large?v=v2&amp;px=999" role="button" title="scenario.jpg" alt="scenario.jpg" /></span></P><P>This guide is split in two parts.</P><P><STRONG>Part 1</STRONG> shows what advanced governance you get out of the box with the Content-as-a-Service (CaaS) mechanism. With a single YAML file the provider can hand consumers credentials that are structurally restricted and let them call orchestration without ever giving them admin access.</P><P><STRONG>Part 2</STRONG> is about everything CaaS does <EM>not</EM> cover — per-team model allowlists when orchestration is shared, token budgets, content-safety enforcement. We sketch a minimal FastAPI proxy that sits transparently between consumers and AI Core, and we run it live to show the principle. We deliberately stop short of a full reference implementation: the moment you want to govern more than orchestration (direct OpenAI/Anthropic/Gemini deployments), the proxy stops being a thin layer.</P><P>All examples use a real test environment: a provider subaccount that owns the AI Core instance, and a consumer subaccount that consumes through CaaS. Every curl and JSON response shown was captured live. This blog's purpose is to show you what is possible and where you need to head to achieve it.</P><H2 id="toc-hId-1795212451">One Instance per Team — or One for Everyone?</H2><P>Before governance tooling, there is a structural question: should each team get their own AI Core instance, or should you centralize?</P><P>With foundation model APIs, the traditional cost argument for centralization does not apply. Unlike the older AI Core pattern of GPU-based model serving where sharing replicas saved real money, foundation models use token-based consumption. There is no GPU infrastructure to share that we manage ourselves. The orchestration "deployment" is an endpoint routing traffic to a provider's model deployment. Every team's tokens are billed per use regardless of how many orchestration endpoints exist.</P><P>So centralization is a choice, not a necessity. Each team could provision their own AI Core instance in their own subaccount and get natural isolation through BTP entitlements and directory-level cost allocation.</P><P>If you do choose to centralize, the practical benefits are: one place to see all usage across teams, faster onboarding (creating a service instance through a broker takes minutes), and a single integration point where you can enforce governance policies. That last point is exactly what we will make use of in the chapters that follow.</P><H1 id="toc-hId-1469616227">Part 1: Native CaaS Governance</H1><P>The mechanism that makes centralized governance possible is SAP AI Core's <STRONG>Content-as-a-Service (CaaS)</STRONG> model. CaaS is a multi-tenant distribution mechanism: one subaccount (the provider) owns the AI Core instance and all its deployments. Other subaccounts (consumers) get access through a service broker that the provider publishes. When a consumer creates a service instance through this broker, they receive credentials that are structurally different from the provider's: fewer scopes, different identity, limited to a shared resource group.</P><P>On a standard AI Core instance every service key is equivalent — same <CODE>clientid</CODE>, same 47 scopes, same admin access. Creating "a key for Team Alpha" and "a key for Team Beta" gives you the illusion of separation with none of the substance. CaaS changes that.</P><H2 id="toc-hId-1402185441">Setting Up CaaS</H2><P>The provider does this once. After that, consumer onboarding is self-service.</P><P><STRONG>1. Define the service in YAML.</STRONG> Commit this to the AI Core artifacts repository that is connected via GitOps. The flags here control what consumers can and cannot do:</P><pre class="lia-code-sample language-yaml"><code># caas-foundation-models.yaml apiVersion: ai.sap.com/v1alpha1 kind: Service metadata: name: foundation-model-service spec: brokerSecret: name: caas-broker-credentials usernameKeyRef: username passwordKeyRef: password capabilities: basic: staticDeployments: true # provider-managed deployments are visible userDeployments: false # consumers cannot create/stop/delete deployments createExecutions: false # consumers cannot run training executions userPromptTemplates: true logs: executions: false deployments: false enableSharedResourceGroup: true # provider deploys orchestration + models here serviceCatalog: - extendCredentials: shared: serviceUrls: AI_API_URL: https://api.ai.internalprod.eu-central-1.aws.ml.hana.ondemand.com extendCatalog: name: foundation-model-service bindable: true plans: - id: standard name: standard description: Standard plan - access to pre-deployed foundation models only</code></pre><P>The <CODE>extendCredentials.serviceUrls.AI_API_URL</CODE> is what every consumer binding will receive as their AI Core endpoint. In Part 2 we will swap this URL for a governance proxy and the consumer SDK will not notice.</P><P><STRONG>2. AI Core registers the service broker.</STRONG> Once the YAML is applied, AI Core creates an Application and exposes a service broker behind a URL like <CODE><A href="https://aisvc-" target="_blank" rel="noopener nofollow noreferrer">https://aisvc-</A>&lt;id&gt;-foundation-model-service.servicebroker.&lt;region&gt;.aws.ml.hana.ondemand.com</CODE>. The broker is what consumer subaccounts will talk to when they create a service instance.</P><P><STRONG>3. Provider deploys orchestration in the shared resource group.</STRONG> The shared RG is the only resource group consumers can see. Whatever the provider puts here is what consumers can call — typically the orchestration deployment, which routes to all 50+ foundation models.</P><P><STRONG>4. Consumer subaccounts onboard.</STRONG> The provider registers the broker in each consumer subaccount with the BTP CLI:</P><pre class="lia-code-sample language-bash"><code>btp register services/broker \ --name foundation-model-broker \ --url https://aisvc--foundation-model-service.servicebroker..aws.ml.hana.ondemand.com \ --user --password --use-sm-tls \ --subaccount </code></pre><P>After that, the consumer is self-service: they create a service instance through the BTP catalog, then a binding, and receive credentials that include the injected <CODE>AI_API_URL</CODE>. Their SAP AI SDK uses those credentials without knowing or caring that a proxy may sit in front.</P><P>Once the broker is registered, <CODE>foundation-model-service</CODE> shows up in the consumer's BTP Service Marketplace just like any other service — there is no AI Core-specific UI, the consumer treats it as a standard managed service:</P><P><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="image-service-marketplace.png" style="width: 932px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/417100iEDB552A411E4A1FF/image-size/large?v=v2&amp;px=999" role="button" title="image-service-marketplace.png" alt="image-service-marketplace.png" /></span></P><P>&nbsp;</P><P>The consumer creates a service instance, then a service key (binding). The credentials look exactly like a "normal" AI Core service key would — <CODE>clientid</CODE>, <CODE>clientsecret</CODE>, <CODE>url</CODE> (the consumer's identity zone), and the <CODE>AI_API_URL</CODE> that was injected by the provider's YAML:</P><P><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="image-created-consumer-instance.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/417101i22EF0CB478B2E8F8/image-size/large?v=v2&amp;px=999" role="button" title="image-created-consumer-instance.png" alt="image-created-consumer-instance.png" /></span></P><P>This is the point of CaaS: from the consumer team's perspective they just consumed a managed service. From the provider's perspective every credential handed out is structurally constrained.</P><BLOCKQUOTE><P>The official AI Core CaaS documentation still describes the older CLI. With BTP CLI 2.106+ the <CODE>btp register services/broker</CODE> command above is the supported path — it works against any subaccount in the global account regardless of CF org/space layout.</P></BLOCKQUOTE><P>Refer to the <A href="https://help.sap.com/docs/sap-ai-core/sap-ai-core-service-guide/ai-content-as-service" target="_self" rel="noopener noreferrer">official Help page</A> for additional insights into this feature and its setup.</P><H2 id="toc-hId-1205671936">Scoped Credentials per Team</H2><P>When a consumer creates a binding through the broker, they receive a credential that is fundamentally different from the provider's:</P><P>Property Provider key Consumer key</P><TABLE><TBODY><TR><TD>Scopes</TD><TD>47 (full admin)</TD><TD><STRONG>3 (minimal)</STRONG></TD></TR><TR><TD><CODE>clientid</CODE></TD><TD><CODE>sb-&lt;provider-id&gt;!b13079\|xsuaa_std!b77089</CODE></TD><TD><CODE>sb-&lt;consumer-id&gt;!b65018\|xsuaa_aicaas!b77089</CODE></TD></TR><TR><TD>Auth endpoint</TD><TD><CODE>&lt;provider-subdomain&gt;.authentication...</CODE></TD><TD><CODE>&lt;consumer-subdomain&gt;.authentication...</CODE></TD></TR><TR><TD>Identity zone</TD><TD>provider</TD><TD>consumer</TD></TR><TR><TD>Reach</TD><TD>everything</TD><TD>call shared deployments</TD></TR></TBODY></TABLE><P>Decoding the consumer JWT confirms it. Three scopes, none of them administrative:</P><pre class="lia-code-sample language-markup"><code>!b65018|xsuaa_aicaas!b77089.servicename.foundation-model-service !b65018|xsuaa_aicaas!b77089.provider. uaa.resource</code></pre><P>The token also carries <CODE>ext_attr.serviceinstanceid</CODE> — the consumer's own service instance ID. In Part 2 the proxy uses this exact field to identify who is calling.</P><H2 id="toc-hId-1009158431">Deployment Protection</H2><P>The <CODE>userDeployments: false</CODE> flag in the YAML is what enforces this. Any attempt by a consumer to create a deployment is denied at the AI Core boundary — before it touches Kubernetes or the orchestration runtime:</P><pre class="lia-code-sample language-bash"><code>curl -s -X POST "$AI_API_URL/v2/lm/deployments" \ -H "Authorization: Bearer $CONSUMER_TOKEN" \ -H "AI-Resource-Group: shared" \ -H "Content-Type: application/json" \ -d '{"configurationId": "00000000-0000-0000-0000-000000000000"}'</code></pre><pre class="lia-code-sample language-markup"><code>HTTP/1.1 403 RBAC: access denied</code></pre><P>Only the provider controls what is deployed and available.</P><H2 id="toc-hId-812644926">Resource Group Isolation</H2><P>AI Core organises work into resource groups, and the provider typically has several — development environments, production workloads, project spaces. Consumers can only see the <CODE>shared</CODE> resource group. Everything else is invisible:</P><pre class="lia-code-sample language-bash"><code># Consumer tries to list deployments in the provider's "default" RG curl -s "$AI_API_URL/v2/lm/deployments" \ -H "Authorization: Bearer $CONSUMER_TOKEN" \ -H "AI-Resource-Group: default"</code></pre><pre class="lia-code-sample language-json"><code>{"count": 0, "resources": []}</code></pre><P>The provider has 11 deployments in <CODE>default</CODE> and dozens more elsewhere. The consumer sees zero. Listing the shared RG, on the other hand, returns exactly what the provider chose to put there:</P><pre class="lia-code-sample language-json"><code>{ "count": 2, "resources": [ {"id": "", "scenarioId": "orchestration", "status": "RUNNING"}, {"id": "", "scenarioId": "foundation-models", "status": "RUNNING"} ] }</code></pre><P>In summary, CaaS gives you scoped credentials, deployment protection, and resource group isolation out of the box — SAP-native, zero custom code.</P><H2 id="toc-hId-616131421">Model Restriction Without Orchestration</H2><P>There is one more thing CaaS gives you natively: <STRONG>model restriction</STRONG>, but only if you give up orchestration. If you do not need templating, content filtering, grounding or data masking, you can deploy each allowed model individually in the shared RG and skip orchestration. The consumer calls them with the native provider inference endpoint — for OpenAI models that is the Azure-compatible chat completions API:</P><pre class="lia-code-sample language-bash"><code>curl -s -X POST \ "$AI_API_URL/v2/inference/deployments//chat/completions?api-version=2024-02-01" \ -H "Authorization: Bearer $CONSUMER_TOKEN" \ -H "AI-Resource-Group: shared" \ -H "Content-Type: application/json" \ -d '{"messages":[{"role":"user","content":"Say hello"}],"max_tokens":15}'</code></pre><pre class="lia-code-sample language-json"><code>{ "choices": [ {"message": {"role": "assistant", "content": "Hello! How can I assist you today?"}} ], "usage": {"prompt_tokens": 9, "completion_tokens": 10, "total_tokens": 19} }</code></pre><P>Models that are not deployed simply do not exist for the consumer — a 404 from AI Core, not a custom error. The trade-off: you lose all orchestration features. No prompt templating, no centralised content filtering, no grounding, no data masking. For simple chat-completion use cases this is enough. For workflows that need safety guardrails, it is not — which is where Part 2 begins.</P><H1 id="toc-hId-290535197">Part 2: Custom Governance Proxy</H1><P>Once orchestration is deployed in the shared resource group, every consumer can request any of the 50+ models through it. Orchestration is a universal model router, and there is no native configuration to restrict which models a specific consumer can use, to track per-team token spend, or to mandate content-safety filters. Even Token Tracking per Team - or maintaining certain orchestration configurations centrally - is technically feasible if we can put a gouvernance proxy in between the consuming team and the centrally hosted AI Core Endpoints.</P><P>The honest assessment up front: <STRONG>this proxy approach scales cleanly when you only proxy the orchestration endpoint.</STRONG> Orchestration is one unified API with one body schema. The moment you also want to govern direct provider deployments — OpenAI chat-completions, Anthropic Messages API, Google Gemini — each schema needs its own model-extraction logic, its own streaming format, its own token usage infos. You end up maintaining a small adapter zoo, and the proxy stops being a thin layer. So when building such a proxy - limitations need to be thought of smartly.</P><H2 id="toc-hId-223104411">Where the Proxy Goes</H2><pre class="lia-code-sample language-markup"><code>Consumer App --&gt; Governance Proxy --&gt; AI Core Orchestration --&gt; Foundation Model (same API) (consumer credentials) (token-based)</code></pre><P>Two pieces matter:</P><OL><LI>The proxy implements the same API path as AI Core (<CODE>/v2/inference/deployments/{id}/completion</CODE>). Any other path is forwarded unchanged.</LI><LI>The CaaS service YAML injects the proxy URL transparently. The same <CODE>extendCredentials.serviceUrls.AI_API_URL</CODE> field we saw in Part 1 now points at the proxy:</LI></OL><pre class="lia-code-sample language-yaml"><code>serviceCatalog: - extendCredentials: shared: serviceUrls: AI_API_URL: https://governance-proxy.cfapps.sap.hana.ondemand.com</code></pre><P>The next time a consumer requests a binding, their service key contains the proxy URL as <CODE>AI_API_URL</CODE>. Their SDK, their CLI, their notebook — all start talking to the proxy without code changes. The Bearer token they send is unchanged: it is still a CaaS-issued JWT, signed by the consumer's own identity zone, carrying <CODE>ext_attr.serviceinstanceid</CODE>. And this is the beauty of this approach - we still give teams the chance to provision the service - get their own service keys and manage them - via the native BTP ways - by hijacking a bit this CaaS approach by infusing a proxy layer. You could of course taks care yourself of hosting a proxy that then authenticates clients with some sort of credentials - but this way a bunch of things are given out of the box.</P><H2 id="toc-hId-26590906">A Minimal Proxy</H2><P>The full proxy is a single 90-line <CODE>main.py</CODE>. It does three things:</P><UL><LI>decode the consumer's JWT and identify them via <CODE>ext_attr.serviceinstanceid</CODE> (handy for logging, even if we do not branch on it here)</LI><LI>enforce a global model allowlist on orchestration calls</LI><LI>pass everything else (<CODE>/v2/lm/...</CODE>, model metadata, scenarios) straight through to AI Core</LI></UL><pre class="lia-code-sample language-python"><code>AICORE_API_URL = os.environ["AICORE_API_URL"] ALLOWED_MODELS = {"gpt-4o", "gpt-4o-mini", "gpt-5"} # OpenAI only def consumer_id_from_token(request: Request) -&gt; str: auth = request.headers.get("Authorization", "") if not auth.startswith("Bearer "): raise HTTPException(401, "Missing Bearer token") payload_b64 = auth[7:].split(".")[1] payload_b64 += "=" * (-len(payload_b64) % 4) payload = json.loads(base64.urlsafe_b64decode(payload_b64)) sid = payload.get("ext_attr", {}).get("serviceinstanceid") if not sid: raise HTTPException(401, "Token missing ext_attr.serviceinstanceid") return sid @app.post("/v2/inference/deployments/{deployment_id}/completion") async def orchestration_completion(deployment_id: str, request: Request): sid = consumer_id_from_token(request) body = await request.json() model = (body.get("orchestration_config", {}) .get("module_configurations", {}) .get("llm_module_config", {}) .get("model_name")) if model not in ALLOWED_MODELS: return JSONResponse( status_code=403, content={"error": f"Model '{model}' not in allowlist", "allowed": sorted(ALLOWED_MODELS)}, ) upstream = f"{AICORE_API_URL}/v2/inference/deployments/{deployment_id}/completion" resp = await request.app.state.http.post( upstream, headers=forward_headers(request), json=body ) if resp.status_code == 200: usage = resp.json().get("orchestration_result", {}).get("usage", {}) print(f"usage consumer={sid} model={model} tokens={usage.get('total_tokens', 0)}") # TODO: persist this to a database to enforce real budgets return Response(content=resp.content, status_code=resp.status_code, media_type=resp.headers.get("content-type")) @app.api_route("/{path:path}", methods=["GET","POST","PUT","DELETE","PATCH","HEAD"]) async def passthrough(path: str, request: Request): """Forward every other AI Core call unchanged.""" url = f"{AICORE_API_URL}/{path}" if request.url.query: url += f"?{request.url.query}" body = await request.body() resp = await request.app.state.http.request( request.method, url, headers=forward_headers(request), content=body or None ) return Response(content=resp.content, status_code=resp.status_code, media_type=resp.headers.get("content-type"))</code></pre><P>The allowlist is <STRONG>global</STRONG> here — the rule applies to every consumer that goes through this proxy. A common reason to do this is vendor trust: an organisation may decide that for a given environment only OpenAI models are approved while Anthropic, Google or Meta models require additional review. With orchestration the model name is in the request body, so a constant set at the top of the proxy is enough to enforce it.</P><P>When you do need per-team allowlists or budgets, swap the constant for a database lookup keyed by <CODE>ext_attr.serviceinstanceid</CODE> from the JWT — the consumer identity is already in every request, you just have to use it.</P><P>Deployment is a one-line <CODE>cf push</CODE> against a 9-line <CODE>manifest.yml</CODE>. The full source is in the <CODE>governance-proxy/</CODE> directory of the GitHub repository.</P><H2 id="toc-hId-177331758">Result</H2><P>With the YAML in Part 2 applied and the proxy deployed at <CODE>governance-proxy.cfapps.sap.hana.ondemand.com</CODE>, here is what the consumer sees.</P><P><STRONG>Allowed model passes through:</STRONG></P><pre class="lia-code-sample language-bash"><code>curl -s -X POST \ "https://governance-proxy.cfapps.sap.hana.ondemand.com/v2/inference/deployments//completion" \ -H "Authorization: Bearer $CONSUMER_TOKEN" \ -H "AI-Resource-Group: shared" \ -H "Content-Type: application/json" \ -d '{ "orchestration_config": { "module_configurations": { "llm_module_config": {"model_name":"gpt-4o-mini","model_params":{"max_tokens":15}}, "templating_module_config": {"template":[{"role":"user","content":"Say hello in German"}]} } } }'</code></pre><pre class="lia-code-sample language-markup"><code>HTTP/1.1 200</code></pre><pre class="lia-code-sample language-json"><code>{ "orchestration_result": { "choices": [{"message": {"content": "Hello in German is \"Hallo.\"", "role": "assistant"}}], "usage": {"prompt_tokens": 11, "completion_tokens": 8, "total_tokens": 19} } }</code></pre><P>Identical response format to AI Core, because the proxy returns AI Core's response unchanged. In the proxy logs:</P><pre class="lia-code-sample language-markup"><code>usage consumer= model=gpt-4o-mini tokens=19</code></pre><P><STRONG>A model that is not in the allowlist is blocked before it reaches AI Core:</STRONG></P><pre class="lia-code-sample language-bash"><code>curl -s -X POST \ "https://governance-proxy.cfapps.sap.hana.ondemand.com/v2/inference/deployments//completion" \ -H "Authorization: Bearer $CONSUMER_TOKEN" \ -H "AI-Resource-Group: shared" \ -H "Content-Type: application/json" \ -d '{ "orchestration_config": { "module_configurations": { "llm_module_config": {"model_name":"anthropic--claude-3-5-sonnet","model_params":{"max_tokens":10}}, "templating_module_config": {"template":[{"role":"user","content":"hi"}]} } } }'</code></pre><pre class="lia-code-sample language-markup"><code>HTTP/1.1 403</code></pre><pre class="lia-code-sample language-json"><code>{ "error": "Model 'anthropic--claude-3-5-sonnet' not in allowlist", "allowed": ["gpt-4o", "gpt-4o-mini", "gpt-5"] }</code></pre><P><STRONG>Non-orchestration calls pass straight through.</STRONG> The consumer's CaaS scopes still constrain what they can reach — listing deployments works, but only in the <CODE>shared</CODE> RG:</P><pre class="lia-code-sample language-bash"><code>curl -s "https://governance-proxy.cfapps.sap.hana.ondemand.com/v2/lm/deployments" \ -H "Authorization: Bearer $CONSUMER_TOKEN" \ -H "AI-Resource-Group: shared"</code></pre><pre class="lia-code-sample language-json"><code>{"count": 2, "resources": [{"scenarioId": "orchestration"}, {"scenarioId": "foundation-models"}]}</code></pre><P>That is governance: the model allowlist is enforced at the proxy, the rest of AI Core's surface area still works for the consumer, and from the SDK's perspective nothing has changed.</P><H2 id="toc-hId--19181747">What You Could Add for Production</H2><P>The minimal example above is a starting point. There are a number of additional governance levels we can achieve with this approach in a clean way:</P><UL><LI><STRONG>Persistent token accounting.</STRONG> The current proxy logs usage to stdout. Persisting this in HANA, Postgres or Redis lets you enforce real budgets ("Team Beta has a 1M-token monthly cap"). We can use the unique identifiers per service instance to implement this per tenant.</LI><LI><STRONG>Content-safety policy injection.</STRONG> Some customers want to enforce a certain level of orchestration configuration for their custom use cases. For example, one could enforce a certain masking operation to be mandatory across all working teams, or add mandatory content filtering. Without it you rely on the developers to do it in their own code.</LI><LI><STRONG>Multi-provider adapters.</STRONG> If consumers also call provider-native deployments, each schema needs its own model-extraction logic. This is where the proxy stops being thin. Consider whether you really need to govern those paths or whether you can require all governed traffic to go through orchestration.</LI></UL><P>The pattern is the same in every case: a transparent proxy that the consumer cannot distinguish from AI Core, with governance logic applied between authentication and forwarding. CaaS gives you the credential isolation; the proxy gives you everything you want to enforce on top of it.</P><H1 id="toc-hId-77707755">Conclusion</H1><P>This blog showed how to achieve deeper levels of governance on top of the AI Foundation for custom AI use cases on BTP. We walked through setting up CaaS for AI Core, what isolation it gives you out of the box, and how a small proxy can fill the gaps when orchestration is shared. Checkout <A href="https://community.sap.com/t5/technology-blog-posts-by-sap/monitor-token-usage-with-sap-generative-ai-hub/ba-p/13979768" target="_self">this blog</A> to read more on tracking tokens with Generative AI Hub. Find the code example on GitHub <A href="https://github.com/fyx99/ai-foundation-blogs/tree/main/ai-core-governance-levels" target="_self" rel="nofollow noopener noreferrer">here</A>. I hope you enjoyed the content — leave any comments below.</P> 2026-06-01T23:45:41.581000+02:00 https://community.sap.com/t5/technology-platform-learning-group-blog-posts/new-sap-btp-live-sessions-auf-deutsch/ba-p/14415241 NEW: 🇩🇪 SAP BTP Live Sessions auf Deutsch 🇩🇪 2026-06-10T09:28:00.168000+02:00 Isabella_L https://community.sap.com/t5/user/viewprofilepage/user-id/1550401 <P><FONT face="arial,helvetica,sans-serif">Hi SAP Community,</FONT></P><P><FONT face="arial,helvetica,sans-serif">am Montag ging’s bei uns mit englischen Sessions los. Und heute legen wir nach. Denn Mittwoch ist doch eigentlich perfekt, um den eigenen Lernplan aufzustellen:&nbsp;</FONT><FONT face="arial,helvetica,sans-serif">Genug vom Wochenstart geschafft und genau der richtige Moment, um die nächsten Schritte zu planen <span class="lia-unicode-emoji" title=":winking_face:">😉</span></FONT></P><P><FONT face="arial,helvetica,sans-serif">Wenn ihr also Lust habt, eure Lernreise weiterzuführen, haben wir jetzt etwas Neues, speziell für unsere <STRONG>deutschsprachige</STRONG> Community:</FONT></P><H3 id="toc-hId-1946399993"><FONT face="arial,helvetica,sans-serif"><span class="lia-unicode-emoji" title=":backhand_index_pointing_right:">👉</span><FONT color="#333399">&nbsp;<FONT color="#800080"><STRONG>Unsere neuen deutschsprachigen Live Sessions starten Mitte Juli!</STRONG></FONT></FONT></FONT></H3><P><FONT face="arial,helvetica,sans-serif">Freut euch auf verschiedene Themen rund um SAP BTP, ideal, um gezielt tiefer in einzelne Bereiche einzusteigen.</FONT></P><P><FONT face="arial,helvetica,sans-serif">Hier ein erster Überblick:</FONT></P><UL><LI><FONT face="arial,helvetica,sans-serif"><U><A title=" Einführung in SAP BTP für Einsteiger" href="https://learning.sap.com/live-sessions/einf-hrung-in-sap-btp-f-r-einsteiger?searchId=e888d6dc-d852-44f7-a0dd-f6af9a74c547&amp;listPosition=3" target="_blank" rel="noopener noreferrer"><STRONG>Einführung in SAP BTP für Einsteiger</STRONG></A></U></FONT></LI><LI><FONT face="arial,helvetica,sans-serif"><A title="Einführung in die SAP Integration Suite für Einsteiger" href="https://learning.sap.com/live-sessions/einf-hrung-in-die-sap-integration-suite-f-r-einsteiger?searchId=e888d6dc-d852-44f7-a0dd-f6af9a74c547&amp;listPosition=4" target="_blank" rel="noopener noreferrer"><STRONG>Einführung in die SAP Integration Suite für Einsteiger</STRONG></A></FONT></LI><LI><FONT face="arial,helvetica,sans-serif"><A title="Joule in ABAP (Durchführung in Deutsch)" href="https://learning.sap.com/live-sessions/joule-in-abap-durchf-hrung-in-deutsch?searchId=e888d6dc-d852-44f7-a0dd-f6af9a74c547&amp;listPosition=5" target="_blank" rel="noopener noreferrer"><STRONG>Joule in ABAP (Durchführung in Deutsch)</STRONG></A></FONT><FONT face="arial,helvetica,sans-serif"><STRONG><BR /></STRONG></FONT></LI></UL><P><FONT face="arial,helvetica,sans-serif">Einige Sessions sind bereits offen zur Anmeldung,&nbsp;</FONT>und für weitere Live Sessions ist die Registrierung ebenfalls schon freigeschaltet:</P><UL><LI><FONT face="arial,helvetica,sans-serif"><STRONG><A title="Nummernkreise und Nummernvergabe mit RAP" href="https://learning.sap.com/live-sessions/nummernkreise-und-nummernvergabe-mit-rap?searchId=674e950f-117a-4b5b-83eb-d364017e9353&amp;listPosition=1" rel="noopener noreferrer" target="_blank">Nummernkreise und Nummernvergabe mit RAP</A></STRONG></FONT></LI><LI><A title="Erstellen eines API Providers und eines API Proxy basierend auf einem On-Premise System" href="https://learning.sap.com/live-sessions/erstellen-eines-api-providers-und-eines-api-proxy-basierend-auf-einem-on-premise-system?searchId=674e950f-117a-4b5b-83eb-d364017e9353&amp;listPosition=2" target="_blank" rel="noopener noreferrer"><FONT face="arial,helvetica,sans-serif"><STRONG><SPAN>Erstellen eines API Providers und eines API Proxy basierend auf einem On-Premise System</SPAN></STRONG></FONT></A></LI><LI><A title="SAP Fiori Berechtigungskonzept" href="https://learning.sap.com/live-sessions/sap-fiori-berechtigungskonzept?searchId=ea06f636-c85a-4f90-9bcf-cc6a0ad3fb7e&amp;listPosition=4" target="_blank" rel="noopener noreferrer"><FONT face="arial,helvetica,sans-serif"><STRONG><SPAN>SAP Fiori Berechtigungskonzept</SPAN></STRONG></FONT></A></LI><LI><A title="Einführung in die SAP Analytics Cloud Integration mit SAP S/4HANA" href="https://learning.sap.com/live-sessions/einf-hrung-in-die-sap-analytics-cloud-integration-mit-sap-s-4hana?searchId=ea06f636-c85a-4f90-9bcf-cc6a0ad3fb7e&amp;listPosition=7" target="_blank" rel="noopener noreferrer"><FONT face="arial,helvetica,sans-serif"><STRONG><SPAN>Einführung in die SAP Analytics Cloud Integration mit SAP S/4HANA</SPAN></STRONG></FONT></A></LI></UL><P><FONT face="arial,helvetica,sans-serif">Weitere folgen nach und nach. Es lohnt sich also, regelmäßig vorbeizuschauen. Wer weiß, vielleicht ist genau die nächste Session dabei, die perfekt zu eurem aktuellen Lernziel passt <span class="lia-unicode-emoji" title=":winking_face:">😉</span></FONT></P><P><FONT face="arial,helvetica,sans-serif">Sichert euch gerne schon jetzt euren Platz. Ich freue mich, viele von euch dort (wieder) zu sehen!</FONT></P><P><FONT face="arial,helvetica,sans-serif">Viele Grüße,</FONT><BR /><FONT face="arial,helvetica,sans-serif">Isabella</FONT></P><P>&nbsp;</P> 2026-06-10T09:28:00.168000+02:00 https://community.sap.com/t5/technology-blog-posts-by-members/sap-s-autonomous-enterprise-beyond-the-announcement-toward-the-architecture/ba-p/14412886 SAP’s Autonomous Enterprise: beyond the announcement, toward the architecture 2026-06-11T09:40:52.566000+02:00 harshateja3 https://community.sap.com/t5/user/viewprofilepage/user-id/2297246 <P>When SAP says it’s becoming a ‘Business AI company,’ that’s not marketing. It’s a structural admission that the ERP paradigm built around systems of record is being replaced by something that executes on your behalf.</P><P>Here’s what I find most interesting as a technical architect, and what I think gets underplayed.</P><P><STRONG>The architecture </STRONG></P><P>Most coverage focuses on Joule, the 224 agents, and the Claude partnership. These are components. What matters is how they stack.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="harshateja3_0-1780861175816.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/418769i63BD11CE30877BB4/image-size/medium?v=v2&amp;px=400" role="button" title="harshateja3_0-1780861175816.png" alt="harshateja3_0-1780861175816.png" /></span></P><P>Figure 1: SAP Joule Architecture Stack</P><P>SAP isn’t trying to build the world’s best AI model. It’s building an <STRONG>AI-powered enterprise operating system</STRONG>. An Anthropic partnership makes sense because the roles are distinct: Claude handles reasoning, and SAP handles domain intelligence and governance.</P><P><EM>“For the mission-critical processes of our customers, ‘almost right’ just isn’t good enough.” Quote by </EM><STRONG>Christian Klein, CEO, SAP</STRONG></P><P><STRONG>What the Autonomous Finance demo actually tells us</STRONG></P><P>The most concrete example from Sapphire: a CFO asks Joule to prepare a bank briefing. Minutes later, a completed presentation surfaces with live data, flagged risks, and analysis. That used to take hours across multiple people.</P><P>That’s a testable claim, which is the right kind of proof point for enterprise buyers. The same logic applies across Autonomous Spend and Autonomous Supply Chain.</P><P>The Autonomous Close Assistant compresses the financial close from weeks to days by automating journal entries, reconciliation, and error resolution. In financial systems with regulatory requirements, there’s no tolerance for ‘good enough.’ That’s what makes the SAP Knowledge Graph central here. It’s not just retrieving data. It’s giving agents the business context to act correctly.</P><P><STRONG>How SAP solved the governance problem</STRONG></P><P>What makes this architecture different from previous enterprise AI attempts is the governed execution layer SAP built around the agents. Joule doesn’t connect directly to agents. Every request routes through the SAP Agent Gateway, which handles identity authentication, principal propagation, and policy enforcement before any agent acts. Agents can collaborate via Agent-to-Agent (A2A) protocol, but every A2A interaction is routed through that gateway. No agent acts outside the governed path. No identity is lost between hops. Every interaction is auditable.n enterprise software, that last point determines whether a CFO will actually sign off on autonomous finance processes.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="harshateja3_1-1780861197988.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/418772i5C25CEEC4EC6C8EE/image-size/medium?v=v2&amp;px=400" role="button" title="harshateja3_1-1780861197988.png" alt="harshateja3_1-1780861197988.png" /></span></P><P>Figure 2: SAP Joule — Joule as orchestrator, SAP Agent Gateway, A2A protocol, and end-to-end governed flow</P><P>The SAP and NVIDIA collaboration on Joule Studio runtime adds another layer. NVIDIA OpenShell provides isolated execution environments, filesystem and network policy enforcement, and runtime containment. SAP contributes the enterprise governance side: roles, identity lifecycle, policy semantics, observability. OpenShell answers ‘Can this agent action safely execute?’ Joule Studio runtime answers ‘Should this action happen at all?’ SAP is a key contributor to the OpenShell open source project. The Joule Studio Early Adopter Program is open now.</P><P><STRONG>What this means for the SAP architect</STRONG></P><P>The required skill set is shifting. The next generation of SAP architects won’t train foundation models, but they will need to understand how agentic systems fit into existing business process logic.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="harshateja3_2-1780861197991.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/418771iAAC13762DE8822BA/image-size/medium?v=v2&amp;px=400" role="button" title="harshateja3_2-1780861197991.png" alt="harshateja3_2-1780861197991.png" /></span></P><P><EM>Figure 4: SAP Architect Skill Stack — core platform, agentic layer, AI fundamentals</EM></P><P>Agent mining is one of the less-discussed announcements worth paying attention to. It’s an extension of process mining: it catalogs what agents did, where they slowed down, and whether they behaved as expected. The AI Agent Hub, included free for all SAP Business AI Platform customers, is where this governance lives. As more agents start operating inside finance and supply chain, this observability is not optional.</P><P>Functional expertise in finance, supply chain, and procurement doesn’t get less valuable here. Someone has to define what ‘correct’ looks like for an agent operating in those domains. The architect who can connect deep process knowledge with agentic design patterns will be at the center of these transformations.</P><P><STRONG>My take</STRONG></P><P>SAP Sapphire 2026 moved the enterprise AI conversation from roadmap to production intent. The partnerships with Anthropic, AWS, NVIDIA, and Google Cloud are real. The domain depth built from 50 years of ERP process logic is a genuine differentiator that general-purpose AI platforms will find hard to replicate.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="harshateja3_3-1780861198015.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/418773i66D32E912CFCA386/image-size/medium?v=v2&amp;px=400" role="button" title="harshateja3_3-1780861198015.png" alt="harshateja3_3-1780861198015.png" /></span></P><P>Figure 3: SAP Autonomous Enterprise — Autonomous Suite, Joule Work, Business AI Platform and key partners</P><P>SAP has also been serious about the data foundation underneath the agents. The Dremio acquisition makes SAP Business Data Cloud an Apache Iceberg-native lakehouse for SAP and non-SAP data. Prior Labs brings tabular foundation modelling in-house. Reltio adds master data management. SAP-RPT-1.5 is a relational pretrained transformer built for structured enterprise data. The model is a commodity layer. The data and context SAP has assembled are not.</P><P>What SAP has built is the coordination layer between AI systems and the systems of record they need to operate inside. That’s been the missing piece in enterprise AI for two years. Joule Studio, the Agent Gateway, agent mining via the AI Agent Hub, and the NVIDIA OpenShell runtime together answer the question most agentic initiatives couldn’t: not whether an agent can act, but whether you can prove it was allowed to.</P><P>One question I keep sitting with: will enterprise AI be won by the best model, or by the platform that best combines business context, governance, and execution? I suspect it’s the latter. SAP is making a credible bet on exactly that.</P><P>#SAP&nbsp; #SAPPHIRE2026&nbsp; #AutonomousEnterprise&nbsp; #EnterpriseAI&nbsp; #Joule&nbsp; #SAPBTP&nbsp; #AgenticAI&nbsp; #DigitalTransformation</P><P>&nbsp;</P> 2026-06-11T09:40:52.566000+02:00 https://community.sap.com/t5/technology-blog-posts-by-members/check-and-then-re-check-your-cloud-foundry-org-and-spaces-for-correct-user/ba-p/14426926 Check and then Re-Check Your Cloud Foundry Org and Spaces for Correct User Assignments 2026-06-25T07:38:01.950000+02:00 AshGoyal https://community.sap.com/t5/user/viewprofilepage/user-id/6574 <P class=""><U><STRONG>Summary</STRONG></U><STRONG>:</STRONG><EM> A user can have zero access to SAP BTP Global and SubAccount and still be able to create, read, edit, or delete every service key in BTP! All you need is access at the Cloud Foundry level. Your landscape can be compromised leading to data privacy issues and business continuity can be disrupted significantly. Read more to find out how.</EM></P><P class="">Most of the organizations use SAP BTP Integration Suite to connect systems across their landscape. A standard pattern is exposing HTTP endpoints (or other inbound endpoints) to third party systems so they can trigger integration flows.</P><P class="">To authenticate against those endpoints, you create service keys on the Process Integration Runtime service instance (integration-flow). These are basically API credentials in a way which we call Service keys (the other API credentials are available in the API Management - Developer Hub) and they live at the Cloud Foundry space tied to the service instance. Anyone with those credentials can call your integration endpoints directly and send or read data.</P><DIV class=""><DIV class=""><DIV class=""><P>&nbsp;</P></DIV></DIV><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="AshGoyal_1-1782365335305.png" style="width: 922px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/425963iD0252ABA2E3A23D0/image-dimensions/922x245?v=v2" width="922" height="245" role="button" title="AshGoyal_1-1782365335305.png" alt="AshGoyal_1-1782365335305.png" /></span></DIV><P class="">BTP admins generally manage user access carefully at SubAccount and Global Account level but generally find it too taxing to manage carefully at Cloud Foundry org and space level. When offboarding someone, most admins remove the user from the SubAccount and Global Account either manually or using IAS and then stop there. If that person still has any kind of CF access, they retain full access to every service key -- and they don't need the BTP cockpit to use it. In fact they won't have access to these using the BTP Cockpit. All they need is CF CLI or CF API to access these. The CF CLI and CF API are available to anyone on the internet for download, and a few commands is all it takes to create, read or delete any service key in the BTP environment.</P><P class="">I have found this security hole at many customers I am working with. The team has removed the user from the SubAccount but the user is still active in Cloud Foundry with no one having bothered to remove them from there thinking that removing them from SubAccount using IAS is enough. It is not! Even if you remove someone through IAS you must separately ensure they are fully removed from CF membership, not just their roles.</P><P class="">Concrete Example: say Target orders flow into S/4HANA via Integration Suite secured by service keys. A disgruntled ex-employee with no BTP cockpit access but still active in CF can delete every one of those keys. Integrations go down, orders stop getting received, and the business stops!</P><P class="">SAP does offer a connector to automate CF user and role management via SAP IPS (Identity Provisioning Service): <A class="" href="https://community.sap.com/t5/technology-blog-posts-by-sap/streamlining-user-management-integrating-sap-integration-suite-with-sap/ba-p/14069705" target="_blank">https://community.sap.com/t5/technology-blog-posts-by-sap/streamlining-user-management-integrating-sap-integration-suite-with-sap/ba-p/14069705</A></P><P class="">If you have used, please comment and share you experience especially on how easy it is to use it.</P><P class="" data-unlink="true">A Big thanks to the <A href="https://www.terrabt.com/products/btp-xid" target="_blank" rel="noopener nofollow noreferrer">SAP BTP xID</A> tool because of which I was able to find this issue.</P><P class="">In the meanwhile I urge all SAP BTP Administrators to check their CF Orgs and Spaces for any assigned users who should not be there.</P><P class="">Update: Possibly,&nbsp;the following security standards get violated when you just rely on controlling S user lifetime to control access to the API and Service Keys.&nbsp;</P><P>1. ISO/IEC 27001:2022 (Information Security Management) -&nbsp;<STRONG>Control A.5.15 (Access Control):</STRONG><SPAN>&nbsp;</SPAN>Requires access to assets to be restricted based on business and security requirements.</P><P>2.&nbsp;NIST SP 800-53 (Security and Privacy Controls) -&nbsp;AC-2 (Account Management)</P><P>3.&nbsp; PCI DSS 4.0 (Payment Card Industry Data Security Standard) -&nbsp;<STRONG>Requirement 8.6:</STRONG><SPAN>&nbsp;</SPAN>Strictly regulates the use of application accounts</P><P>4.&nbsp;SOC 2 Type II (Trust Services Criteria) -&nbsp;<STRONG>Logical Access Controls (CC6.1/CC6.2):</STRONG><SPAN>&nbsp;</SPAN>Internal controls must prevent unauthorized logical access to data.</P><P>5.&nbsp; Sarbanes-Oxley (SOX) Section 404 (Internal Controls) Compliance - Section 404 mandates that management and auditors establish, maintain, and regularly assess the effectiveness of internal controls over financial reporting to prevent fraud and data tampering. Financial data generally passes through these integrations on a regular basis. If the keys are freely accessible, it is possible, that a rogue internal or external actor can tamper with integrations, run them with incorrect data with no way to find out later who did it.</P><P><STRONG>My recommendation:</STRONG>&nbsp;<SPAN>&nbsp;I would recommend that apart from one nominated administrator, nobody else should have access to the Production SAP BTP Cloud Foundry Environment in normal course of business. The access should be given to the CF environment only as temporary firefighter access same as is today done in SAP ERP or S/4HANA Production systems. Developers generally do not have unhindered access in these systems, most of the time not even read only access. The same concept needs to be applied to SAP BTP production environments also. This needs to be matured as part of SAP BTP Governance setup.</SPAN></P> 2026-06-25T07:38:01.950000+02:00 https://community.sap.com/t5/community-corner-blog-posts/ask-me-anything-with-sap-champions-monthly-series-session-5/ba-p/14426631 Ask Me Anything with SAP Champions – Monthly Series (Session 5) 2026-07-01T08:21:48.442000+02:00 Martin-Pankraz https://community.sap.com/t5/user/viewprofilepage/user-id/143781 <DIV><SPAN>Hi folks, Martin here <span class="lia-unicode-emoji" title=":waving_hand:">👋</span></SPAN></DIV><DIV>&nbsp;</DIV><DIV><SPAN><span class="lia-unicode-emoji" title=":clapper_board:">🎬</span>We're back — and this time we're getting our hands dirty with security.</SPAN></DIV><DIV>&nbsp;</DIV><DIV><SPAN>The </SPAN><SPAN><STRONG>Ask Me Anything with SAP Champions</STRONG></SPAN><SPAN>&nbsp;series is rolling into </SPAN><SPAN><STRONG>Session 5</STRONG></SPAN><SPAN>, and I'm excited to be in the hot seat this time. The concept is dead simple:&nbsp;</SPAN><SPAN><STRONG>you ask, I answer.&nbsp;</STRONG></SPAN><SPAN>No slides, no scripted demos, no marketing gloss — just honest answers to the questions you actually care about.</SPAN></DIV><DIV>&nbsp;</DIV><DIV><SPAN>And the topic? The one that keeps SAP architects, Basis admins, and CISOs up at night: </SPAN><STRONG>SAP Security&nbsp;<span class="lia-unicode-emoji" title=":shield:">🛡</span>️</STRONG></DIV><DIV>&nbsp;</DIV><DIV><SPAN>Securing S/4HANA, RISE, GROW, BTP, threat detection, identity and access, integration security, and the brand-new headache of AI agents poking around in your SAP data — if it's about keeping SAP safe, it's fair game.</SPAN></DIV><H1 id="toc-hId-1689191680"><SPAN><span class="lia-unicode-emoji" title=":thinking_face:">🤔</span>So what should you ask me?</SPAN></H1><DIV><SPAN>Honestly? Whatever's bugging you. But if you want a head start, here's what fits this session perfectly:</SPAN></DIV><DIV>&nbsp;</DIV><DIV><SPAN>-</SPAN><SPAN> <span class="lia-unicode-emoji" title=":locked_with_key:">🔐</span> </SPAN><SPAN><STRONG>Securing SAP in the cloud</STRONG></SPAN><SPAN>&nbsp;— RISE, S/4HANA, BTP and the works</SPAN></DIV><DIV><SPAN>-</SPAN><SPAN> <span class="lia-unicode-emoji" title=":eyes:">👀</span> </SPAN><SPAN><STRONG>Threat detection &amp; monitoring</STRONG></SPAN><SPAN>&nbsp;— actually </SPAN><SPAN>*<EM>seeing</EM>*</SPAN><SPAN> what's happening inside SAP</SPAN></DIV><DIV><SPAN>-</SPAN><SPAN> 🪪 </SPAN><SPAN><STRONG>Identity &amp; access</STRONG></SPAN><SPAN>&nbsp;— SSO, principal propagation, federation, least privilege done right</SPAN></DIV><DIV><SPAN>-</SPAN><SPAN> <span class="lia-unicode-emoji" title=":link:">🔗</span> </SPAN><SPAN><STRONG>Integration security</STRONG></SPAN><SPAN>&nbsp;— APIs, OData, BTP, connecting SAP to the outside world without leaving the door open</SPAN></DIV><DIV><SPAN>-</SPAN><SPAN> <span class="lia-unicode-emoji" title=":robot_face:">🤖</span> </SPAN><SPAN><STRONG>AI &amp; automation</STRONG></SPAN><SPAN>&nbsp;— keeping copilots and agents that read SAP data on a tight leash</SPAN></DIV><DIV><SPAN>-</SPAN><SPAN> <span class="lia-unicode-emoji" title=":rocket:">🚀</span> </SPAN><SPAN><STRONG>Getting started</STRONG></SPAN><SPAN>&nbsp;— practical first steps when you're maturing your SAP security posture</SPAN></DIV><P>&nbsp;</P><DIV><SPAN>Don't see your topic? Ask anyway. The questions I have to </SPAN><SPAN>*<EM>think</EM>*</SPAN><SPAN> about are always the best ones — and far more fun than the easy ones. <span class="lia-unicode-emoji" title=":winking_face:">😉</span></SPAN></DIV><H1 id="toc-hId-1492678175"><SPAN><span class="lia-unicode-emoji" title=":incoming_envelope:">📨</span>How to send me your questions (pick whatever's easiest)</SPAN></H1><DIV><SPAN>Three ways in, all roads lead to the same place:</SPAN></DIV><DIV>&nbsp;</DIV><DIV><SPAN>1.</SPAN> <SPAN><STRONG>Microsoft Forms</STRONG></SPAN><SPAN>&nbsp;— name or community handle optional, ask anonymously if you like <span class="lia-unicode-emoji" title=":backhand_index_pointing_right:">👉</span> </SPAN><A href="https://forms.office.com/r/VAxUZ0bueu" target="_blank" rel="noopener nofollow noreferrer"><SPAN>link</SPAN></A></DIV><DIV><SPAN>2.</SPAN> <SPAN><STRONG>Comment right here</STRONG></SPAN><SPAN>&nbsp;— drop your question under this blog post</SPAN></DIV><DIV><SPAN>3.</SPAN> <SPAN><STRONG>LinkedIn</STRONG></SPAN><SPAN>&nbsp;— reply to my announcement post <span class="lia-unicode-emoji" title=":backhand_index_pointing_right:">👉</span> </SPAN><A href="https://www.linkedin.com/posts/martin-pankraz_ask-me-anything-with-sap-champions-monthly-share-7478053045201965056-DkPa/?utm_source=share&amp;utm_medium=member_desktop&amp;rcm=ACoAABCWYKIBwipw0Xs9gLqf3laY9Nrb6RedM3A" target="_blank" rel="noopener nofollow noreferrer"><SPAN>LinkedIn post link</SPAN></A></DIV><P>&nbsp;</P><DIV><SPAN><span class="lia-unicode-emoji" title=":spiral_calendar:">🗓</span>️ </SPAN><SPAN>Get them in by: <STRONG>July 7th</STRONG></SPAN></DIV><H1 id="toc-hId-1296164670"><SPAN><span class="lia-unicode-emoji" title=":movie_camera:">🎥</span>What happens next</SPAN></H1><DIV><SPAN>Here's the neat part — there's nothing to attend, nothing to squeeze into your calendar:</SPAN></DIV><P>&nbsp;</P><DIV><SPAN>1.</SPAN><SPAN> You send your questions before the deadline.</SPAN></DIV><DIV><SPAN>2.</SPAN><SPAN> I pick the most interesting and widely useful ones.</SPAN></DIV><DIV><SPAN>3.</SPAN><SPAN> I answer them </SPAN><SPAN><STRONG>on camera in a recorded video on the SAP Community YouTube channel</STRONG></SPAN><SPAN>&nbsp;<span class="lia-unicode-emoji" title=":television:">📺</span></SPAN></DIV><DIV><SPAN>4.</SPAN><SPAN> And for the readers among you (I see you <span class="lia-unicode-emoji" title=":eyes:">👀</span>), a </SPAN><SPAN><STRONG>written recap blog</STRONG></SPAN><SPAN>&nbsp;with all the questions and answers lands right here afterwards.</SPAN></DIV><DIV>&nbsp;</DIV><DIV><SPAN>So whether you prefer to watch or read, you get the full thing on your own schedule. <span class="lia-unicode-emoji" title=":raising_hands:">🙌</span></SPAN></DIV><H1 id="toc-hId-1099651165"><SPAN><span class="lia-unicode-emoji" title=":light_bulb:">💡</span>Why bother joining in?</SPAN></H1><DIV><SPAN>-</SPAN> <SPAN><STRONG>Get a real answer to a real problem</STRONG></SPAN><SPAN>&nbsp;— bring me the thing you're genuinely stuck on.</SPAN></DIV><DIV><SPAN>-</SPAN> <SPAN><STRONG>Learn from questions you'd never have thought to ask</STRONG></SPAN><SPAN>&nbsp;— this community always surfaces angles I love.</SPAN></DIV><DIV><SPAN>-</SPAN> <SPAN><STRONG>Steer the series</STRONG></SPAN><SPAN>&nbsp;— your questions shape what we tackle next.</SPAN></DIV><DIV>&nbsp;</DIV><H1 id="toc-hId-903137660"><SPAN><span class="lia-unicode-emoji" title=":backhand_index_pointing_right:">👉</span>Over to you</SPAN></H1><DIV><SPAN>SAP security isn't a one-and-done checkbox — it's an ongoing conversation. So let's have it.</SPAN></DIV><DIV>&nbsp;</DIV><DIV><SPAN>Fire your question over via <A href="https://forms.office.com/r/VAxUZ0bueu" target="_blank" rel="noopener nofollow noreferrer">anonymous Forms</A>, drop it in the comments, or hit me up on [LinkedIn — placeholder] before July 6th.</SPAN></DIV><DIV>&nbsp;</DIV><DIV><SPAN>I'll see you in the recording — and in the recap blog right here on the community. Let's go! <span class="lia-unicode-emoji" title=":rocket:">🚀</span></SPAN></DIV><DIV>&nbsp;</DIV><DIV><SPAN>See the other series editions in the <A href="https://search.sap.com/search.html?isu_context=community&amp;isu_page=1&amp;force_is=true&amp;isu_keyword=Ask%20Me%20Anything%20with%20SAP%20Champions%20%E2%80%93%20Monthly%20Series" target="_blank" rel="noopener noreferrer">community corner</A> and where it all began <A href="https://community.sap.com/t5/community-corner-blog-posts/ask-me-anything-with-sap-champions-monthly-series-session-1/ba-p/14310542?emcs_t=S2h8ZW1haWx8a3Vkb3N8TUw0VklRREhDM0hGUzh8MTQzMTA1NDJ8S1VET1N8aEs" target="_blank">here</A>.</SPAN></DIV><DIV>&nbsp;</DIV><DIV><SPAN>#SAPChampions #AMA #SAPCommunity #SAPSecurity #SAPCyberDefense</SPAN></DIV><DIV>&nbsp;</DIV><DIV><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="MartinPankraz_0-1782312403703.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/425818i7FE36E1FA073035E/image-size/large?v=v2&amp;px=999" role="button" title="MartinPankraz_0-1782312403703.png" alt="MartinPankraz_0-1782312403703.png" /></span></DIV> 2026-07-01T08:21:48.442000+02:00 https://community.sap.com/t5/technology-blog-posts-by-members/integrating-sap-concur-with-sap-iag-implementation-guide-and-key-learnings/ba-p/14427494 Integrating SAP Concur with SAP IAG – Implementation Guide and Key Learnings 2026-07-01T22:58:56.028000+02:00 Swapnil_Balharpure https://community.sap.com/t5/user/viewprofilepage/user-id/77960 <H1 id="toc-hId-1689219738">Introduction</H1><P>SAP IAG Enterprise (Standard) edition provides out-of-the-box integration with SAP Concur for user provisioning and access governance. However, during implementation, it has been observed that certain areas require deeper understanding beyond standard documentation.</P><P>This blog covers:</P><UL><LI>Detailed configuration steps</LI><LI>Important technical considerations</LI><LI>Practical challenges faced during implementation</LI></UL><P>The intent is to provide a simple and practical guide for SAP IAG consultants working on SAP Concur integration.</P><P>&nbsp;</P><H1 id="toc-hId-1492706233">Initial SAP IAG System Setup</H1><P>Before starting the integration, ensure the following setup is completed:</P><OL><LI>SAP BTP setup: Global Account → Subaccount → SAP IAG Enterprise Edition subscription (Test/Prod)</LI><LI>Trust configuration is completed with SAP Cloud Identity Services (CIS), including attribute mapping</LI><LI>Standard SAP IAG groups are created in SAP CIS, such as: IAG_USER, IAG_WF_MANAGER, IAG_WF_ADMIN, IAG_RAA_DEFAULT, etc.</LI><LI>If the manager is used as an approval stage in access requests, the user’s manager must be assigned with the IAG_WF_MANAGER group so that it is automatically derived in the access request form. Otherwise, the requester needs to manually select the manager from users assigned to this group</LI><LI>Role collection to CIS group mapping is configured (for example): CIAG_Access_Request, CIAG_Access_Analysis mapped to a custom CIS group like ZIAG_Access_Requestor.</LI><LI>Access to SAP IAG with administrator privileges</LI><LI>User data source is configured using SAP Identity Services Identity Directory or Identity Authentication Service via IPS_PROXY V2.</LI><LI>Application parameters and master data are properly maintained</LI><LI>User and group synchronization is configured using SCIM</LI><LI>Mail server is configured for outbound emails (Destinations:&nbsp;<SPAN>parameters_destination and&nbsp;</SPAN>bpmworkflowruntime_mail)</LI></OL><P>&nbsp;</P><H1 id="toc-hId-1296192728">SAP Concur to SAP IAG Integration and Configuration Steps</H1><P><EM>The following steps outline the end-to-end configuration required to integrate SAP Concur with SAP IAG after completing the initial system setup.</EM></P><P><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="Swapnil_Balharpure_0-1782409578083.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/426165iA23F203F85171DDE/image-size/large?v=v2&amp;px=999" role="button" title="Swapnil_Balharpure_0-1782409578083.png" alt="Swapnil_Balharpure_0-1782409578083.png" /></span></P><P>&nbsp;</P><H2 id="toc-hId-1228761942">Step 1: User Provisioning Service V4 (UPSv4)</H2><P><EM>User Provisioning Service V4 (UPSv4) is an SAP Concur API framework that enables SAP IAG to automate user provisioning and lifecycle management in SAP Concur.</EM></P><P>To use the User Provisioning Service (UPSv4) API, the client must have Concur Expense, Concur Travel, or both.</P><P>Clients using Concur Expense Professional/Premium Edition and/or Concur Request Professional/Premium Edition need to get UPS enabled through their Concur Client Executive (Sales Representative).</P><P>In addition, the client must subscribe to Client Web Services after signing the web services agreement. This will then be included as part of the SAP Concur contract.</P><P>For API details, refer to:</P><UL><LI><SPAN><A title="SAP API Hub – Concur User Provisioning" href="https://api.sap.com/api/ConcurUserProvisioning/overview" target="_blank" rel="noopener noreferrer">SAP API Hub – Concur User Provisioning</A></SPAN></LI><LI><SPAN><A title="SAP API Hub – Concur User Provisioning" href="https://developer.concur.com/api-reference/user-provisioning/v4.user-provisioning.html" target="_blank" rel="noopener nofollow noreferrer">Concur Developer Documentation – User Provisioning v4</A></SPAN></LI></UL><P>There are also certain limitations with UPS, which can be referred to in SAP Note:</P><UL><LI><SPAN><A title="SAP Note 3363157" href="https://me.sap.com/notes/3363157" target="_blank" rel="noopener noreferrer">SAP Note 3363157</A></SPAN></LI></UL><P>&nbsp;</P><H2 id="toc-hId-1032248437">Step 2: Configure OAuth2 authentication application and Generate company refresh token and UUID</H2><P>Once the User Provisioning Service (UPSv4) is enabled, the next step is to configure OAuth2 authentication for SAP Concur integration.</P><P><EM>This step establishes secure API-based authentication between SAP IAG and SAP Concur using OAuth2 credentials and tokens.</EM></P><P>This involves two key activities:</P><H3 id="toc-hId-964817651">Step 2.1: Configure OAuth2 Application</H3><P><EM>This helps to create authentication credentials (Client ID/Secret) and defines required API access scopes.</EM></P><UL><LI>Create an OAuth2 authentication application in SAP Concur</LI><LI>Generate <STRONG>Client ID and Client Secret</STRONG></LI><LI>Maintain the required <STRONG>grants and scopes</STRONG></LI></UL><H4 id="toc-hId-897386865">Step 2.2: Generate Company Token and UUID</H4><P><EM>This provides tenant-specific identifiers and tokens required for API communication with SAP Concur.</EM></P><UL><LI>Generate the <STRONG>Company Request Token</STRONG></LI><LI>Obtain: Token Service URL, Refresh Token, Company UUID</LI></UL><P>A detailed reference for this setup is available in the SAP Community blog by&nbsp;<a href="https://community.sap.com/t5/user/viewprofilepage/user-id/826513">@tim_chapman24</a>&nbsp;</P><UL><LI><SPAN><A title="Introduction to Web Services for Concur Expense Authentication" href="https://community.sap.com/t5/enterprise-resource-planning-blog-posts-by-sap/introduction-to-web-services-for-concur-expense-authentication/ba-p/13554400" target="_blank">Introduction to Web Services for Concur Expense Authentication</A></SPAN></LI></UL><P>Additional reference:</P><UL><LI><SPAN><A title="Concur Authentication API Documentation" href="https://developer.concur.com/api-reference/authentication/apidoc.html" target="_blank" rel="noopener nofollow noreferrer">Concur Authentication API Documentation</A></SPAN></LI></UL><H4 id="toc-hId-700873360">Important Configuration Points</H4><UL><LI>While configuring the OAuth2 application, ensure that the required <STRONG>grants and scopes are maintained correctly</STRONG></LI><LI>Missing grant or scope may result in <STRONG>403 (Forbidden) errors in provisioning logs</STRONG></LI></UL><P>For SAP IAG integration, the following grants can be maintained:</P><UL><LI>refresh_token</LI><LI>password</LI></UL><P>For more details, refer to:</P><UL><LI><SPAN><A title="Refresh Token Grant" href="https://developer.concur.com/api-reference/authentication/apidoc.html#refresh_token" target="_blank" rel="noopener nofollow noreferrer">Refresh Token Grant</A></SPAN></LI><LI><SPAN><A title="Password Grant" href="https://developer.concur.com/api-reference/authentication/apidoc.html#password_grant" target="_blank" rel="noopener nofollow noreferrer">Password Grant</A></SPAN></LI></UL><H4 id="toc-hId-504359855">Scopes to be Maintained</H4><P>Below are the commonly required scopes:</P><P class="lia-align-left" style="text-align : left;">&nbsp;</P><TABLE border="1" width="99.89165763813651%"><TBODY><TR><TD width="40.30335861321777%"><P><STRONG>Scope</STRONG></P></TD><TD width="59.58829902491875%"><P><STRONG>Scope Description</STRONG></P></TD></TR><TR><TD width="40.30335861321777%"><P>identity.user.core.read</P></TD><TD width="59.58829902491875%"><P>Read user core data</P></TD></TR><TR><TD width="40.30335861321777%"><P>identity.user.coresensitive.read</P></TD><TD width="59.58829902491875%"><P>Read core sensitive data</P></TD></TR><TR><TD width="40.30335861321777%"><P>identity.user.emails.verified.writeonly</P></TD><TD width="59.58829902491875%"><P>Write access for verified email</P></TD></TR><TR><TD width="40.30335861321777%"><P>identity.user.enterprise.read</P></TD><TD width="59.58829902491875%"><P>Read user enterprise data</P></TD></TR><TR><TD width="40.30335861321777%"><P>identity.user.coreenterprise.writeonly</P></TD><TD width="59.58829902491875%"><P>Write access to all core and enterprise fields except external ID</P></TD></TR><TR><TD width="40.30335861321777%"><P>identity.user.externalID.writeonly</P></TD><TD width="59.58829902491875%"><P>Write access to external ID only</P></TD></TR><TR><TD width="40.30335861321777%"><P>identity.user.ids.read</P></TD><TD width="59.58829902491875%"><P>Read user ID data</P></TD></TR><TR><TD width="40.30335861321777%"><P>identity.user.sap.read</P></TD><TD width="59.58829902491875%"><P>Read a user’s SAP Global ID. Used for intra SAP service communication</P></TD></TR><TR><TD width="40.30335861321777%"><P>identity.user.sap.writeonly</P></TD><TD width="59.58829902491875%"><P>Write a user’s SAP Global ID. Used for intra SAP service communication</P></TD></TR><TR><TD width="40.30335861321777%"><P>spend.user.general.read</P></TD><TD width="59.58829902491875%"><P>View spend user information</P></TD></TR><TR><TD width="40.30335861321777%"><P>spend.user.general.writeonly</P></TD><TD width="59.58829902491875%"><P>Change spend user information</P></TD></TR><TR><TD width="40.30335861321777%"><P>travel.user.general.read</P></TD><TD width="59.58829902491875%"><P>Read general Travel data: Travel approval manager, Travel Name, Rule Class, Groups, Org Unit, Travel Custom Fields</P></TD></TR><TR><TD width="40.30335861321777%"><P>travel.user.private.read</P></TD><TD width="59.58829902491875%"><P>Read private Travel data: CRS Name/GDS Sync ID, Travel Name Remark, Gender</P></TD></TR><TR><TD width="40.30335861321777%"><P>user.provision.read</P></TD><TD width="59.58829902491875%"><P>Request status of a provisioning request</P></TD></TR><TR><TD width="40.30335861321777%"><P>user.provision.write</P></TD><TD width="59.58829902491875%"><P>Provision a user</P></TD></TR></TBODY></TABLE><H4 id="toc-hId-307846350">&nbsp;</H4><H4 id="toc-hId--386384250">Required Permissions in SAP Concur</H4><P class="lia-align-left" style="text-align : left;">Ensure that the Concur administrator has the following permissions:</P><TABLE border="1" width="99.89165763813651%"><TBODY><TR><TD width="49.945828819068254%"><P><STRONG>Activity</STRONG></P></TD><TD width="49.945828819068254%"><P><STRONG>Permission</STRONG></P></TD></TR><TR><TD width="49.945828819068254%"><P>Configure OAuth2 authentication Application</P></TD><TD width="49.945828819068254%"><P>Web Services Administrator</P></TD></TR><TR><TD width="49.945828819068254%"><P>Generate Company Request Token and Company UUID</P></TD><TD width="49.945828819068254%"><P>Web Services Administrator</P></TD></TR><TR><TD width="49.945828819068254%"><P>User Creation and Maintenance</P></TD><TD width="49.945828819068254%"><P>Employee Administrator</P></TD></TR><TR><TD width="49.945828819068254%"><P>Permission Assignment and Administration</P></TD><TD width="49.945828819068254%"><P class="lia-align-left" style="text-align : left;">Role Administrator</P></TD></TR></TBODY></TABLE><H2 id="toc-hId-3908259">&nbsp;</H2><H2 id="toc-hId--192605246">Step 3: Destination Setup in BTP Subaccount</H2><P><EM>This step defines the connectivity configuration in SAP BTP to enable SAP IAG to communicate with SAP Concur APIs.</EM></P><P>Create a destination for SAP Concur in the BTP subaccount where the SAP IAG service is subscribed.</P><P>Maintain the destination with the following details:</P><TABLE border="1" width="99.89165763813652%"><TBODY><TR><TD width="28.277356446370533%"><P><STRONG>Property Key</STRONG></P></TD><TD width="71.61430119176599%"><P><STRONG>Values</STRONG></P></TD></TR><TR><TD width="28.277356446370533%"><P>Name</P></TD><TD width="71.61430119176599%"><P>CONCUR (or any other preferred name)</P></TD></TR><TR><TD width="28.277356446370533%"><P>Type</P></TD><TD width="71.61430119176599%"><P>HTTP</P></TD></TR><TR><TD width="28.277356446370533%"><P>Description</P></TD><TD width="71.61430119176599%"><P>Concur Destination (or any other preferred description)</P></TD></TR><TR><TD width="28.277356446370533%"><P>URL</P></TD><TD width="71.61430119176599%"><P data-unlink="true">&lt;Enter SAP Concur API URL&gt; For example: <SPAN>https://us.api.concursolutions.com&nbsp;</SPAN> (Refer to <SPAN><A title="https://me.sap.com/notes/2914977/E" href="https://me.sap.com/notes/2914977/E" target="_blank" rel="noopener noreferrer">https://me.sap.com/notes/2914977/E</A></SPAN> for Concur URLs)</P></TD></TR><TR><TD width="28.277356446370533%"><P>ProxyType</P></TD><TD width="71.61430119176599%"><P>Internet</P></TD></TR><TR><TD width="28.277356446370533%"><P>Authentication</P></TD><TD width="71.61430119176599%"><P>OAuth2RefreshToken</P></TD></TR><TR><TD width="28.277356446370533%"><P>Use mTLS for token retrieval</P></TD><TD width="71.61430119176599%"><P>&lt;Unchecked&gt;</P></TD></TR><TR><TD width="28.277356446370533%"><P>Client ID</P></TD><TD width="71.61430119176599%"><P>Enter the generated Concur Client ID in Step 2.1</P></TD></TR><TR><TD width="28.277356446370533%"><P>Client Secret</P></TD><TD width="71.61430119176599%"><P>Enter the generated Concur Client Secret in Step 2.1</P></TD></TR><TR><TD width="28.277356446370533%"><P>Token Service URL Type</P></TD><TD width="71.61430119176599%"><P>Dedicated</P></TD></TR><TR><TD width="28.277356446370533%"><P>Token Service URL</P></TD><TD width="71.61430119176599%"><P>Enter the SAP Concur token URL in Step 2.2</P></TD></TR><TR><TD width="28.277356446370533%"><P>CompanyEntityCode</P></TD><TD width="71.61430119176599%"><P>Registered Company Entity Code can be obtained from SAP Concur team</P></TD></TR><TR><TD width="28.277356446370533%"><P>CompanyUUID</P></TD><TD width="71.61430119176599%"><P>Generated Company UUID in Step 2.2 (will be used as prefix to user ID in SAP Concur)</P></TD></TR><TR><TD width="28.277356446370533%"><P>RefreshToken</P></TD><TD width="71.61430119176599%"><P>Generated refresh token in Step 2.2</P></TD></TR><TR><TD width="28.277356446370533%"><P>Use default client truststore</P></TD><TD width="71.61430119176599%"><P>&lt;Checked&gt;</P></TD></TR></TBODY></TABLE><P>&nbsp;</P><P><STRONG>Important Note: </STRONG>The <STRONG>Company Entity Code</STRONG> is used as a prefix for the user ID during provisioning in SAP Concur from SAP IAG. As a result, the user ID is created in the format: &lt;user_ID&gt;@&lt;CompanyEntityCode&gt;</P><P>&nbsp;</P><H2 id="toc-hId--389118751">Step 4: Create an Application in SAP IAG</H2><P><EM>This step registers SAP Concur as a managed application in SAP IAG to enable access governance and provisioning.</EM></P><P>Log in to SAP IAG and navigate to: <STRONG>Administration → Application</STRONG></P><P>Click on the <STRONG>‘+’</STRONG> icon to create a new application and maintain the following details:</P><TABLE border="1" width="99.89165763813652%"><TBODY><TR><TD width="24.593716143011918%" height="50px"><P><STRONG>Field</STRONG></P></TD><TD width="75.2979414951246%" height="50px"><P><STRONG>Value</STRONG></P></TD></TR><TR><TD width="24.593716143011918%" height="50px"><P>Application Name</P></TD><TD width="75.2979414951246%" height="50px"><P>CONCUR (or Any other preferred name)</P></TD></TR><TR><TD width="24.593716143011918%" height="50px"><P>Description</P></TD><TD width="75.2979414951246%" height="50px"><P>SAP Concur Application (or any other preferred description)</P></TD></TR><TR><TD width="24.593716143011918%" height="50px"><P>Application Type</P></TD><TD width="75.2979414951246%" height="50px"><P>SAP Concur</P></TD></TR><TR><TD width="24.593716143011918%" height="77px"><P>HCP Destination</P></TD><TD width="75.2979414951246%" height="77px"><P>&lt;BTP destination created above. Provide exactly same name of BTP destination.&gt;</P></TD></TR></TBODY></TABLE><P>&nbsp;</P><H4 id="toc-hId--1172438270">Mandatory Custom Fields</H4><P>Once the application is created, SAP IAG automatically creates <STRONG>four mandatory custom fields</STRONG>.<BR />These can be verified under: <STRONG>Administration → Custom Fields</STRONG></P><TABLE border="1" width="99.89165763813651%"><TBODY><TR><TD width="25.677139761646806%"><P><STRONG>Name</STRONG></P></TD><TD width="13.651137594799568%"><P><STRONG>Description</STRONG></P></TD><TD width="13.651137594799568%"><P><STRONG>Label</STRONG></P></TD><TD width="6.28385698808234%"><P><STRONG>Input Type</STRONG></P></TD><TD width="5.742145178764897%"><P><STRONG>Data Type</STRONG></P></TD><TD width="7.150595882990249%"><P><STRONG>Field Length</STRONG></P></TD><TD width="9.100758396533044%"><P><STRONG>Required</STRONG></P></TD><TD width="18.634886240520043%"><P><STRONG>Allowed values</STRONG></P></TD></TR><TR><TD width="25.677139761646806%"><P>COUNTRY</P></TD><TD width="13.651137594799568%"><P>Spend User Country</P></TD><TD width="13.651137594799568%"><P>Country</P></TD><TD width="6.28385698808234%"><P>Input Text</P></TD><TD width="5.742145178764897%"><P>String</P></TD><TD width="7.150595882990249%"><P>2</P></TD><TD width="9.100758396533044%"><P>Yes</P></TD><TD width="18.634886240520043%"><P>A two-letter country code defined in ISO 3166-1 alpha-2</P><P>F(e.g. GB for UK, AU for Australia, US for United States of America, etc.)</P></TD></TR><TR><TD width="25.677139761646806%"><P>LOCALE</P></TD><TD width="13.651137594799568%"><P>Spend User Locale</P></TD><TD width="13.651137594799568%"><P>Spend-User Locale</P></TD><TD width="6.28385698808234%"><P>Input Text</P></TD><TD width="5.742145178764897%"><P>String</P></TD><TD width="7.150595882990249%"><P>5</P></TD><TD width="9.100758396533044%"><P>Yes</P></TD><TD width="18.634886240520043%"><P>Required when using Spend User extension. Valid locale from the list of configured locales as defined in [RFC5646]. But here for Concur, the locale will be an ISO 639 language code with an ISO 3166 country/region code, separated by a underscore (e.g., en_US, en_AU, de_DE, etc.)</P></TD></TR><TR><TD width="25.677139761646806%"><P>REIMBURSEMENT_CURRENCY</P></TD><TD width="13.651137594799568%"><P>SpendUser Reimbursement Currency</P></TD><TD width="13.651137594799568%"><P>Reimbursement Currency</P></TD><TD width="6.28385698808234%"><P>Input Text</P></TD><TD width="5.742145178764897%"><P>String</P></TD><TD width="7.150595882990249%"><P>3</P></TD><TD width="9.100758396533044%"><P>Yes</P></TD><TD width="18.634886240520043%"><P>Valid three digit currency code in the list of system reimbursement currencies. Ex. AUD, USD, etc.</P></TD></TR><TR><TD width="25.677139761646806%"><P>REIMBURSEMENT_TYPE</P></TD><TD width="13.651137594799568%"><P>SpendUser Reimbursement Type</P></TD><TD width="13.651137594799568%"><P>Reimbursement Type</P></TD><TD width="6.28385698808234%"><P>Input Text</P></TD><TD width="5.742145178764897%"><P>String</P></TD><TD width="7.150595882990249%"><P>20</P></TD><TD width="9.100758396533044%"><P>Yes</P></TD><TD width="18.634886240520043%"><P>The reimbursement type for the user. Supported values: ACCOUNTS_PAYABLE, ADP_PAYROLL, CONCUR_PAY, OTHER.</P></TD></TR></TBODY></TABLE><P>&nbsp;</P><P><STRONG>Important Points</STRONG></P><UL><LI>These custom fields will appear in the <STRONG>access request form</STRONG> for SAP Concur</LI><LI>All four fields are <STRONG>mandatory</STRONG> for both new and existing users</LI><LI>Values must be provided in the <STRONG>correct format</STRONG>, otherwise provisioning will fail</LI></UL><P>Even though SAP IAG provides an option to edit or deactivate these fields under Custom Fields, it is recommended <STRONG>not to change them</STRONG>, as they are required for Concur provisioning.</P><P>&nbsp;</P><P><STRONG>Additional Note</STRONG></P><P>SAP is introducing additional custom fields to support more Concur attributes. You can track updates here: <SPAN><A title="SAP Roadmap Explorer – SAP IAG Concur Enhancements" href="https://roadmaps.sap.com/board?PRODUCT=73555000100800000334&amp;range=FIRST-LAST#;INNO=33158590E66E1EDFBDFA8168F69E0F64" target="_blank" rel="noopener noreferrer">SAP Roadmap Explorer – SAP IAG Concur Enhancements</A></SPAN></P><P>&nbsp;</P><H2 id="toc-hId--782145761">Step 5: Run Repository Sync Job</H2><P><EM>This step helps to synchronize users and access (roles/profiles) from SAP Concur into SAP IAG for governance processes.</EM></P><P>After creating the application, run the <STRONG>Repository Sync</STRONG> job to fetch data from SAP Concur.</P><P>Navigate to <STRONG>Administration → Job Scheduler </STRONG>and execute the <STRONG>Repository Sync</STRONG> job for the SAP Concur application</P><P>Once the job is completed successfully, user and access data from SAP Concur are synchronized to SAP IAG.</P><P>You can verify the synchronized data in:</P><UL><LI><STRONG>Maintain User Data</STRONG></LI><LI><STRONG>Access Maintenance</STRONG> (use filters for SAP Concur)</LI></UL><P><STRONG><SPAN>User Data</SPAN></STRONG></P><UL><LI>SAP Concur user ID is displayed in the format: &lt;user_id&gt;@&lt;CompanyEntityCode&gt;</LI><LI>The &lt;user_id&gt; corresponds to the login name maintained in SAP CIS</LI></UL><P><STRONG><SPAN>Access Data</SPAN></STRONG></P><P>Under <STRONG>Access Maintenance</STRONG>, two types of access are available for SAP Concur:</P><OL><LI><STRONG>Concur Product: </STRONG>Represents Concur profiles such as Expense, Invoice, Reporting, Request, and Travel</LI><LI><STRONG>Single Roles: </STRONG>Represents authorization roles such as EXP_APPROVER, EXP_ATTENDEE_ADMIN, EXP_CONFIG_ADMIN_CLIENT, etc.</LI></OL><P>Both access types can be requested via SAP IAG. Additional attributes such as: Business Process, Subprocess, Criticality, Alias, Assignment Approvers etc. can be maintained to control workflow routing and approval determination.</P><P><STRONG>Note:</STRONG><BR />Only users assigned with the IAG_RAA_DEFAULT group are available for role assignment approval.</P><P>&nbsp;</P><H2 id="toc-hId--978659266">Step 6: Configure Access Risk Ruleset</H2><P><EM>This step helps to enable risk analysis by importing and activating SAP Concur-specific segregation of duties rules.</EM></P><P>For risk analysis, the standard <STRONG>GLOBAL ruleset for SAP Concur</STRONG> needs to be requested.</P><UL><LI>Create an SAP Support case for component: <STRONG>GRC-IAG-AA (Access Analysis Service)</STRONG></LI><LI>Provide required access (IAS Administration) to SAP to upload the ruleset</LI></UL><P>Once the ruleset is uploaded:</P><UL><LI>A business function group <STRONG>SAP_CONCUR</STRONG> is created</LI><LI>All SAP Concur-related risks are available under this group</LI></UL><P><STRONG>Ruleset Behavior</STRONG></P><UL><LI>SAP Concur roles are standard and cannot be customized</LI><LI>Risks are defined based on <STRONG>conflicting role combinations</STRONG></LI></UL><P><STRONG>Example:</STRONG></P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Swapnil_Balharpure_0-1782412739778.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/426179i74A7106A9C72514C/image-size/large?v=v2&amp;px=999" role="button" title="Swapnil_Balharpure_0-1782412739778.png" alt="Swapnil_Balharpure_0-1782412739778.png" /></span></P><P>Post ruleset setup, validate the risk count against the business function group and run the <STRONG>Access Analysis</STRONG> job from the Job Scheduler.</P><P>After completion of <STRONG>Access Analysis</STRONG> job User-level risks can be checked in ‘<STRONG>Access Analysis’ </STRONG>application and role-level risks can be checked in ‘<STRONG>Access Maintenance’ </STRONG>application<STRONG>.</STRONG></P><P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</P><H2 id="toc-hId--1175172771">Step 7: User ID mapping</H2><P><EM>This step aligns user identities across systems to avoid duplicates and ensure accurate license consumption.</EM></P><P>User ID mapping is important for license optimization in SAP IAG. The <STRONG>Monitored User List</STRONG> in <EM>Maintain User Data</EM> shows users consuming IAG licenses</P><P><STRONG>Key Consideration</STRONG></P><P>SAP Concur uses a different user ID format: &lt;user_ID&gt;@&lt;prefix&gt;</P><P>If multiple applications are integrated with SAP IAG:</P><UL><LI>The same user may appear as different users due to different ID formats</LI><LI>This can lead to <STRONG>duplicate license consumption</STRONG></LI></UL><P>SAP IAG supports auto user ID mapping for most applications Refer: SAP Note 3553352 (<EM>Auto-Generated Entries in User ID Mapping</EM>) however, <STRONG>SAP Concur is not supported for auto-mapping</STRONG></P><P>Hence to avoid duplicate license consumption user ID mapping must be maintained manually. This requires additional monitoring as part of ongoing operations for new user creation and also increases administrative effort.</P><P><STRONG>&nbsp;</STRONG></P><P><STRONG>How to Maintain Mapping</STRONG></P><UL><LI>Navigate to: <STRONG>Administration → Maintain User ID Mapping</STRONG></LI><LI>Mapping can be maintained: Individually or via Bulk upload through CSV file</LI></UL><UL><LI>Master User ID → Login name from user source and Mapped ID → SAP Concur User ID</LI></UL><P><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="Swapnil_Balharpure_1-1782409628731.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/426166i50B11D6B680BD691/image-size/medium?v=v2&amp;px=400" role="button" title="Swapnil_Balharpure_1-1782409628731.png" alt="Swapnil_Balharpure_1-1782409628731.png" /></span></P><P>&nbsp;</P><H2 id="toc-hId--1371686276">Additional Notes</H2><UL><LI>Other IAG services (Access Request, Workflow, Role Design, Access Analysis, Access Certification) work similarly to other applications</LI><LI><STRONG>Privileged Access Management (PAM) Service</STRONG> is not supported for SAP Concur</LI></UL><P><STRONG>&nbsp;</STRONG></P><H1 id="toc-hId--1274796774">Key Learnings and Limitations</H1><P>Based on implementation experience, below are some important points to be aware of:</P><P><STRONG>1. Provisioning Behavior (Asynchronous Processing)</STRONG></P><P class="lia-indent-padding-left-30px" style="padding-left : 30px;">Provisioning in SAP Concur works in an <STRONG>asynchronous manner</STRONG>.</P><UL><LI><STRONG>Step 1:</STRONG> When the access request is submitted, the first run of the provisioning job shows the status as <STRONG>“In Process”</STRONG></LI><LI><STRONG>Step 2:</STRONG> In the next job run, the final status is updated as <STRONG>“Successful” or “Failed”</STRONG> based on the actual result</LI></UL><P class="lia-indent-padding-left-30px" style="padding-left : 30px;">So, the provisioning result is not available immediately in the first run.</P><P><STRONG>2. Manual User ID Mapping Required</STRONG></P><P class="lia-indent-padding-left-30px" style="padding-left : 30px;">As SAP Concur does not support automated user ID mapping:</P><UL><LI>Manual mapping is required in SAP IAG</LI><LI>Continuous monitoring is needed for new users</LI></UL><P class="lia-indent-padding-left-30px" style="padding-left : 30px;">Without this, duplicate users may be created, leading to additional license consumption.</P><P><STRONG>3. Mandatory Custom Fields</STRONG></P><P class="lia-indent-padding-left-30px" style="padding-left : 30px;">All four custom fields are mandatory:</P><UL><LI>COUNTRY</LI><LI>LOCALE</LI><LI>REIMBURSEMENT_CURRENCY</LI><LI>REIMBURSEMENT_TYPE</LI></UL><P class="lia-indent-padding-left-30px" style="padding-left : 30px;">If any field is left empty or deactivated, <STRONG>provisioning will fail</STRONG>.</P><P><STRONG>4. No Validation for Custom Fields</STRONG></P><P class="lia-indent-padding-left-30px" style="padding-left : 30px;">Custom fields accept only specific values (mentioned in step 4) and formats (case-sensitive).</P><P class="lia-indent-padding-left-30px" style="padding-left : 30px;">However:</P><UL><LI>Validation is not enforced at the request submission stage, which may require additional checks during provisioning</LI><LI>Users can submit incorrect values</LI><LI>Request goes through full approval workflow</LI><LI>Failure happens only during provisioning job execution.</LI></UL><P class="lia-indent-padding-left-30px" style="padding-left : 30px;">In addition:</P><UL><LI>Logs may require additional analysis to identify the exact issue</LI><LI>Administrators need to analyze logs to find the problem</LI></UL><P><STRONG>&nbsp;5.&nbsp;</STRONG><STRONG>No Pre-population of Custom Fields</STRONG></P><UL><LI>Custom fields need to be maintained for both <STRONG>new and existing users</STRONG></LI><LI>There is <STRONG>no pre-filled data</STRONG> even for existing users</LI></UL><P class="lia-indent-padding-left-30px" style="padding-left : 30px;">This requires proper <STRONG>end-user training</STRONG> before rollout.</P><P><STRONG>&nbsp;6.&nbsp;</STRONG><STRONG>Partial User Creation in case of errors</STRONG></P><P class="lia-indent-padding-left-30px" style="padding-left : 30px;">If incorrect values are provided in custom fields user may still get created in SAP Concur but <STRONG>no profiles or roles are assigned</STRONG></P><P class="lia-indent-padding-left-30px" style="padding-left : 30px;">Such users are difficult to find using standard user search and may require support from SAP Concur functional team to verify at database level.</P><P class="lia-indent-padding-left-30px" style="padding-left : 30px;">Users who exist in SAP Concur but do not have any profiles (Expense, Travel, etc.) will still appear in <STRONG>Maintain User Data </STRONG>and will be counted for <STRONG>SAP IAG licensing.</STRONG></P><P><STRONG>7. No Bulk Provisioning Support</STRONG></P><P class="lia-indent-padding-left-30px" style="padding-left : 30px;">SAP IAG currently does not support <STRONG>bulk user provisioning/deprovisioning</STRONG> for SAP Concur.</P><P class="lia-indent-padding-left-30px" style="padding-left : 30px;">Recommended approach:</P><UL><LI>Use <STRONG>SAP ICS (Integration with SAP Concur Solutions)&nbsp;/ SAP IPS</STRONG> for user creation with basic roles and/or user account termination/deactivation.</LI><LI>Use <STRONG>SAP IAG</STRONG> only for role-based access requests</LI></UL><P><STRONG>8. Option for HR-Driven Provisioning</STRONG></P><P class="lia-indent-padding-left-30px" style="padding-left : 30px;">Integration with <STRONG>SuccessFactors</STRONG> can be used to trigger user creation/termination and manage lifecycle and provisioning automatically.</P><P><STRONG>9. Refresh Token Handling</STRONG></P><UL><LI>Refresh token used in BTP destination has a validity of <STRONG>6 months</STRONG></LI><LI>SAP IAG / SAP IPS automatically refreshes the token during provisioning job execution</LI></UL><P class="lia-indent-padding-left-30px" style="padding-left : 30px;">No manual intervention is required in normal scenarios.</P><P><STRONG>10. Standard Risk Rules May Need Adjustment</STRONG></P><P class="lia-indent-padding-left-30px" style="padding-left : 30px;">The <STRONG>Global</STRONG> ruleset for SAP Concur includes some risks which may not be relevant because SAP Concur has built-in controls for certain scenarios to prevent risks.</P><P class="lia-indent-padding-left-30px" style="padding-left : 30px;">Such risks can be reviewed with business and deactivated, if required.</P><P>&nbsp;</P><P>Overall, the integration is manageable, but attention to detail is important, especially around custom fields and user mapping. This guidance is based on practical implementation experience, highlighting what worked well and the challenges encountered during execution.</P><P>Going forward, SAP may address some of these challenges, such as improvements in custom field handling, automated user ID mapping, more relevant global rulesets, and clearer provisioning logs, which should simplify the integration further.</P><P>If you have faced similar challenges or have additional insights, feel free to share your experience in the comments.</P><P>&nbsp;</P> 2026-07-01T22:58:56.028000+02:00 https://community.sap.com/t5/abap-blog-posts/how-to-scan-custom-abap-for-security-issues-in-eclipse-step-by-step/ba-p/14432681 How to Scan Custom ABAP for Security Issues in Eclipse (Step-by-Step) 2026-07-03T10:20:40.741000+02:00 vahagn https://community.sap.com/t5/user/viewprofilepage/user-id/760188 <P>Disclosure: I work on this tool at RedRays. This post is a straightforward setup guide, not a product pitch.</P><P>This post walks through connecting Eclipse to a static analysis backend that scans custom ABAP for common security issues (SQL injection, missing authorization checks, hard-coded credentials, weak crypto, and similar) and returns findings directly in the IDE.</P><P>Prerequisites</P><P>- Eclipse 2024-09 or newer<BR />- SAP ABAP Development Tools (ADT) installed<BR />- Java 17<BR />- Network access to the backend you plan to scan against (in this walkthrough, a demo instance)</P><P>Step 1: Get an API key</P><P>The plugin needs an API key to authenticate against a scan backend. For testing, there's a self-service demo instance:</P><P>1. Open get.abap-security.com.<BR />2. Enter a name and email address.<BR />3. Click Create my Eclipse API key.<BR />4. Copy the key immediately - it is displayed once.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="vahagn1_0-1783066920118.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/428776i8BB52724E950C78B/image-size/large?v=v2&amp;px=999" role="button" title="vahagn1_0-1783066920118.png" alt="vahagn1_0-1783066920118.png" /></span></P><P>&nbsp;</P><P>Notes on the demo instance:<BR />- Limited to one key per IP address per time window.<BR />- It is a shared instance - do not submit confidential or production code to it. For real use, point the plugin at your own tenant or an on-premise instance instead (see "Beyond the demo" below).</P><P>Step 2: Install the plugin</P><P>In Eclipse:</P><P>1. Help → Install New Software…<BR />2. Click Add… and enter the update site: plugin.abap-security.com<BR />3. Select RedRays ABAP Scanner from the list.<BR />4. Finish the wizard and restart Eclipse when prompted.</P><P>Step 3: Configure the connection</P><P>1. Window → Preferences → RedRays Scanner<BR />2. Set Working mode to RedRays.<BR />3. Set RedRays URL to <A href="https://demo.abap-security.com:8443/" target="_blank" rel="noopener nofollow noreferrer">https://demo.abap-security.com:8443/</A> (or your own instance's URL).<BR />4. Paste the API key from Step 1 into RedRays API key.<BR />5. Click Test connection and confirm it succeeds before continuing.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="vahagn1_0-1783066782307.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/428775iD8C8BE3FF61E2273/image-size/large?v=v2&amp;px=999" role="button" title="vahagn1_0-1783066782307.png" alt="vahagn1_0-1783066782307.png" /></span></P><P>&nbsp;</P><P>Step 4: Run a scan</P><P>1. Right-click any ABAP object in the Project Explorer.<BR />2. Select Scan with RedRays.<BR />3. Choose the Quick scan profile for a first run.<BR />4. Findings appear in a dedicated Eclipse view as the scan completes.</P><P>Reading the results</P><P>- Findings are grouped by severity: Critical, High, Medium, Low.<BR />- Double-clicking a finding opens the source at the exact line.<BR />- Each finding includes a CVSS score and an automated exploitability check, intended to reduce false positives that would otherwise need manual triage.</P><P>Categories currently covered include: SQL/ADBC injection, OS command execution, dynamic WHERE/ORDER BY clauses, path traversal on OPEN DATASET, RFC trust issues, missing AUTHORITY-CHECK, hard-coded credentials, and weak cryptographic algorithms (MD5/SHA-1), among others.</P><P>Beyond the demo</P><P>The same plugin can point at a privately provisioned tenant or an on-premise instance instead of the shared demo, with isolated access per subaccount and no source retention (code is scanned in memory and discarded; only findings are stored). There is also a REST API for scanning from CI/CD, including an endpoint that returns an allow/block decision for a transport based on a severity threshold - useful as a pre-import gate.</P><P>Resources</P><P>- Plugin overview: redrays.io/abap-scanner-eclipse-plugin<BR />- Demo / API key: get.abap-security.com</P> 2026-07-03T10:20:40.741000+02:00 https://community.sap.com/t5/technology-blog-posts-by-sap/migrating-sap-btp-service-bindings-from-binding-secret-to-mtls-x-509-a-step/ba-p/14433514 Migrating SAP BTP Service Bindings from Binding-Secret to mTLS (X.509) — A Step-by-Step Fix 2026-07-05T13:55:59.350000+02:00 kayur_goyal https://community.sap.com/t5/user/viewprofilepage/user-id/304198 <P><STRONG><STRONG><STRONG><STRONG>The Error</STRONG></STRONG></STRONG></STRONG></P><DIV><SPAN><SPAN><SPAN><SPAN>During the upgrade, the following error appeared for an older service instance:</SPAN></SPAN></SPAN></SPAN><DIV><SPAN><SPAN><SPAN><SPAN>Async operation for service binding "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"(Guid of the servivce instance)</SPAN></SPAN></SPAN></SPAN><DIV><SPAN><SPAN><SPAN><SPAN>between app "application-name" and service instance "service-name"&nbsp;<SPAN>with offering "html5-apps-repo" and plan "app-runtime" failed with errors:&nbsp;<SPAN>10009 CF-UnableToPerform bind could not be completed:&nbsp;<SPAN>Service broker error: Service broker html5-apps-repo-sb failed with:&nbsp;<SPAN>Failed to obtain UAA cloning binding information.&nbsp;<SPAN>Status code: 400. Body: {"error":"Unsupported credential type"}.</SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN><DIV><STRONG><STRONG><STRONG><STRONG>Root cause</STRONG></STRONG></STRONG></STRONG><DIV><SPAN><SPAN><SPAN><SPAN><SPAN>The existing XSUAA configuration of the service instance only allowed `binding-secret` as the credential type. It had no awareness of X.509, so any attempt to create an mTLS binding was rejected by the service broke</SPAN></SPAN></SPAN></SPAN></SPAN><DIV>&nbsp;<DIV><STRONG><STRONG><STRONG><STRONG>The Fix</STRONG></STRONG></STRONG></STRONG><DIV><STRONG><STRONG><STRONG><STRONG>Step 1 — Create a Service Key for the Existing Instance</STRONG></STRONG></STRONG></STRONG><DIV><DIV><SPAN><SPAN><SPAN><SPAN>First, create a service key using the old credential type to access the instance's current XSUAA configuration using below cli command:</SPAN></SPAN></SPAN></SPAN></DIV><DIV>&nbsp;</DIV><DIV><SPAN><SPAN><SPAN><SPAN>cf create-service-key &lt;serviceInstanceName&gt; &lt;serviceInstanceKeyName&gt; ​&nbsp;</SPAN></SPAN></SPAN></SPAN><DIV><DIV>&nbsp;</DIV><DIV><DIV><STRONG>Step 2 — Extract the UUID from the xsappname</STRONG></DIV><DIV><DIV><SPAN>Retrieve the service key and locate the </SPAN><SPAN>`xsappname`</SPAN><SPAN> field using below cli command:</SPAN></DIV><DIV>&nbsp;</DIV><DIV><DIV><SPAN>cf</SPAN> <SPAN>service-key</SPAN> <SPAN>&lt;</SPAN><SPAN>serviceInstanceNam</SPAN><SPAN>e</SPAN><SPAN>&gt;</SPAN> <SPAN>&lt;</SPAN><SPAN>serviceInstanceKeyNam</SPAN><SPAN>e</SPAN><SPAN>&gt;</SPAN></DIV><DIV>&nbsp;</DIV><DIV><DIV><SPAN>The </SPAN><SPAN>xsappname</SPAN><SPAN>&nbsp;will look like this:&nbsp;</SPAN><SPAN>fec39a25-a570-46b0-8ac9-1691f8d663cc!b6711|html5-apps-repo-uaa!b6711</SPAN></DIV><DIV><SPAN>Extract the UUID portion — everything </SPAN><SPAN>before</SPAN><SPAN>&nbsp;the </SPAN><SPAN>`!`</SPAN><SPAN><SPAN>:&nbsp;</SPAN></SPAN><SPAN>fec39a25-a570-46b0-8ac9-1691f8d663cc</SPAN></DIV><DIV>&nbsp;</DIV><DIV><DIV><STRONG>Step 3 — Update the Service Instance to Allow X.509</STRONG></DIV><DIV><DIV><SPAN>Create a file named </SPAN><SPAN>`update-instance.json`</SPAN><SPAN> with the following content, using the UUID extracted above:</SPAN></DIV><DIV><DIV><SPAN>{</SPAN></DIV><DIV><SPAN>"</SPAN><SPAN>xs-security</SPAN><SPAN>"</SPAN><SPAN>:</SPAN> <SPAN>{</SPAN></DIV><DIV><SPAN>&nbsp; &nbsp; "</SPAN><SPAN>xsappname</SPAN><SPAN>"</SPAN><SPAN>:</SPAN> <SPAN>"</SPAN><SPAN>fec39a25-a570-46b0-8ac9-1691f8d663cc</SPAN><SPAN>"</SPAN><SPAN>,</SPAN></DIV><DIV><SPAN>&nbsp; &nbsp; &nbsp;"</SPAN><SPAN>oauth2-configuration</SPAN><SPAN>"</SPAN><SPAN>:</SPAN> <SPAN>{</SPAN></DIV><DIV><SPAN>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;"</SPAN><SPAN>credential-types</SPAN><SPAN>"</SPAN><SPAN>:</SPAN> <SPAN>[</SPAN><SPAN>"</SPAN><SPAN>binding-secret</SPAN><SPAN>"</SPAN><SPAN>,</SPAN> <SPAN>"</SPAN><SPAN>x509</SPAN><SPAN>"</SPAN><SPAN>]</SPAN></DIV><DIV><SPAN>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;}</SPAN></DIV><DIV><SPAN>&nbsp; &nbsp; &nbsp; &nbsp;}</SPAN></DIV><DIV><SPAN>}</SPAN></DIV><DIV><DIV>&nbsp;</DIV><DIV><SPAN>Include both </SPAN><SPAN>`</SPAN><SPAN>binding-secret</SPAN><SPAN>`</SPAN><SPAN> and </SPAN><SPAN>`</SPAN><SPAN>x509</SPAN><SPAN>`</SPAN><SPAN> in </SPAN><SPAN>`</SPAN><SPAN>credential-types</SPAN><SPAN>`</SPAN><SPAN> if you need to support both during a rolling migration.</SPAN></DIV><DIV><DIV><SPAN>Then apply the update using below cf cli command:</SPAN></DIV><DIV><DIV><SPAN>cf</SPAN> <SPAN>update-service</SPAN> <SPAN>&lt;</SPAN><SPAN>serviceInstanceNam</SPAN><SPAN>e</SPAN><SPAN>&gt;</SPAN> <SPAN>-c</SPAN> <SPAN>update-instance.json</SPAN></DIV><DIV><DIV><DIV>&nbsp;</DIV></DIV><DIV><SPAN>This updates the XSUAA app configuration to allow X.509-based bindings for this service instance.</SPAN></DIV><DIV>&nbsp;</DIV><DIV><STRONG>Verification</STRONG></DIV><DIV><DIV><DIV><SPAN>To confirm the instance now supports X.509 bindings, create a new service key explicitly requesting the </SPAN><SPAN>`x509`</SPAN><SPAN> credential type.</SPAN></DIV><BR /><DIV><SPAN>Create </SPAN><SPAN>`parameters.json`</SPAN><SPAN>:</SPAN></DIV><DIV><DIV><DIV><SPAN>{</SPAN></DIV><DIV><SPAN>&nbsp; &nbsp; "</SPAN><SPAN>xsuaa</SPAN><SPAN>"</SPAN><SPAN>:</SPAN> <SPAN>{</SPAN></DIV><DIV><SPAN>&nbsp; &nbsp; &nbsp; &nbsp; "</SPAN><SPAN>credential-type</SPAN><SPAN>"</SPAN><SPAN>:</SPAN> <SPAN>"</SPAN><SPAN>x509</SPAN><SPAN>"</SPAN><SPAN>,</SPAN></DIV><DIV><SPAN>&nbsp; &nbsp; &nbsp; &nbsp; "</SPAN><SPAN>x509</SPAN><SPAN>"</SPAN><SPAN>:</SPAN> <SPAN>{</SPAN></DIV><DIV><SPAN>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; "</SPAN><SPAN>key-length</SPAN><SPAN>"</SPAN><SPAN>:</SPAN> <SPAN>2048</SPAN><SPAN>,</SPAN></DIV><DIV><SPAN>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; "</SPAN><SPAN>validity</SPAN><SPAN>"</SPAN><SPAN>:</SPAN> <SPAN>7</SPAN><SPAN>,</SPAN></DIV><DIV><SPAN>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; "</SPAN><SPAN>validity-type</SPAN><SPAN>"</SPAN><SPAN>:</SPAN> <SPAN>"</SPAN><SPAN>DAYS</SPAN><SPAN>"</SPAN></DIV><DIV><SPAN>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;}</SPAN></DIV><DIV><SPAN>&nbsp; &nbsp; &nbsp; }</SPAN></DIV><DIV><SPAN>}</SPAN></DIV><DIV>&nbsp;</DIV><DIV><DIV><DIV><SPAN>Create the service key using below cli command:</SPAN></DIV><DIV><DIV><DIV>&nbsp;</DIV><DIV><SPAN>cf</SPAN> <SPAN>create-service-key</SPAN> <SPAN>&lt;</SPAN><SPAN>serviceInstanceNam</SPAN><SPAN>e</SPAN><SPAN>&gt;</SPAN> <SPAN>&lt;</SPAN><SPAN>serviceInstanceKeyNameNe</SPAN><SPAN>w</SPAN><SPAN>&gt;</SPAN> <SPAN>-c</SPAN> <SPAN>parameters.json</SPAN></DIV><DIV>&nbsp;</DIV><DIV><DIV><DIV><SPAN>Retrieve it using below cf cli command:</SPAN></DIV><DIV>&nbsp;</DIV><DIV><DIV><DIV><SPAN>cf</SPAN> <SPAN>service-key</SPAN> <SPAN>&lt;</SPAN><SPAN>serviceInstanceNam</SPAN><SPAN>e</SPAN><SPAN>&gt;</SPAN> <SPAN>&lt;</SPAN><SPAN>serviceInstanceKeyNameNe</SPAN><SPAN>w</SPAN><SPAN>&gt;</SPAN></DIV></DIV></DIV></DIV></DIV></DIV></DIV></DIV></DIV></DIV></DIV></DIV></DIV></DIV></DIV></DIV></DIV></DIV></DIV></DIV></DIV></DIV></DIV></DIV><DIV>&nbsp;</DIV><DIV><SPAN><SPAN><SPAN><SPAN>A successful result will include a <SPAN>`certificate`<SPAN> field and <SPAN>`"credential-type": "x509"`<SPAN>:</SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></DIV><DIV><SPAN><SPAN><SPAN><SPAN><SPAN><SPAN><SPAN><SPAN>{ </SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></DIV><DIV><SPAN><SPAN><SPAN><SPAN><SPAN><SPAN><SPAN><SPAN>&nbsp; &nbsp; &nbsp;"certificate": "-----BEGIN CERTIFICATE-----...-----END CERTIFICATE-----\n...", </SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></DIV><DIV><SPAN><SPAN><SPAN><SPAN><SPAN><SPAN><SPAN><SPAN>&nbsp; &nbsp; &nbsp;"clientid": "...", "credential-type":&nbsp; </SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></DIV><DIV><SPAN><SPAN><SPAN><SPAN><SPAN><SPAN><SPAN><SPAN>&nbsp; &nbsp; &nbsp; "x509", </SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></DIV><DIV><SPAN><SPAN><SPAN><SPAN><SPAN><SPAN><SPAN><SPAN>&nbsp; &nbsp; &nbsp; &nbsp;... </SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></DIV><DIV><SPAN><SPAN><SPAN><SPAN><SPAN><SPAN><SPAN><SPAN>}</SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></DIV><DIV><SPAN><SPAN><SPAN><SPAN><SPAN><SPAN><SPAN><SPAN>If you see the certificate chain in the output, the service instance is now configured correctly and your mTLS-based application binding will succeed.</SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN><P>This fix is applicable to any SAP BTP service instance backed by XSUAA where the credential type was never explicitly configured to support X.509.</P><P>If you hit the "Unsupported credential type" error during an mTLS migration, updating the XSUAA "oauth2-configuration" on the service instance is the path forward.</P><P>Referred help document - <A href="https://help.sap.com/docs/btp/sap-business-technology-platform/configure-credential-type-for-html5-application-repository-service-instances?locale=en-US" target="_blank" rel="noopener noreferrer">https://help.sap.com/docs/btp/sap-business-technology-platform/configure-credential-type-for-html5-application-repository-service-instances?locale=en-US&nbsp;</A></P><P>&nbsp;</P><P><BR /><BR /></P></DIV></DIV></DIV></DIV></DIV></DIV></DIV></DIV></DIV></DIV></DIV></DIV> 2026-07-05T13:55:59.350000+02:00 https://community.sap.com/t5/technology-platform-learning-group-blog-posts/lernen-verbindet-entdecke-unsere-deutschsprachigen-live-sessions-in-q3/ba-p/14434778 Lernen verbindet – Entdecke unsere 🇩🇪 deutschsprachigen 🇩🇪 Live Sessions in Q3 2026-07-06T18:19:45.569000+02:00 Isabella_L https://community.sap.com/t5/user/viewprofilepage/user-id/1550401 <P><STRONG>Q3 ist in vollem Gange. Welche Themen möchtest du dieses Quartal noch entdecken?</STRONG></P><P>Vielleicht gibt es ein Thema, das schon länger auf deiner Lernliste steht. Vielleicht möchtest du dein Wissen vertiefen oder einfach neue Impulse mitnehmen.</P><P>Unsere deutschsprachigen SAP BTP Live Sessions bieten die Gelegenheit dazu. Von Grundlagen über Integration und Entwicklung bis hin zu Architektur- und Automatisierungsthemen wartet ein vielfältiges Lernangebot auf dich.</P><DIV><DIV>Vielleicht ist genau die Session, die dich weiterbringt, bereits Teil des aktuellen Programms:</DIV></DIV><P><A href="https://community.sap.com/t5/technology-platform-learning-group-blog-posts/new-sap-btp-live-sessions-auf-deutsch/ba-p/14415241" target="_blank">https://community.sap.com/t5/technology-platform-learning-group-blog-posts/new-sap-btp-live-sessions-auf-deutsch/ba-p/14415241</A></P><P>Also welches Thema möchtest du in Q3 noch entdecken?</P><P>Wir sehen uns in den Live Sessions!&nbsp;</P><P>&nbsp;</P> 2026-07-06T18:19:45.569000+02:00 https://community.sap.com/t5/technology-blog-posts-by-sap/q2-2026-quarterly-release-highlights-for-sap-btp-security-and-identity-amp/ba-p/14437441 Q2 2026: Quarterly Release Highlights for SAP BTP Security and Identity & Access Management 2026-07-10T10:32:22.335000+02:00 RegineSchimmer https://community.sap.com/t5/user/viewprofilepage/user-id/8286 <P><SPAN>The world of security never stands still, and neither do we. Here's a quick look at the latest SAP BTP Security and Identity &amp; Access Management updates from this quarter, with the features and improvements worth adding to your radar. &nbsp;</SPAN></P><P><SPAN>For a complete overview of feature deliveries for SAP Cloud Identity Services, check out our list of all new feature announcements in the <A href="https://help.sap.com/docs/cloud-identity-services/cloud-identity-services/what-s-new-for-identity-authentication" target="_blank" rel="noopener noreferrer">SAP Cloud Identity Services Release Notes</A> on the SAP Help Portal.</SPAN></P><H2 id="toc-hId-1819225820"><SPAN>SAP Cloud Identity Services: Technical users</SPAN></H2><P><SPAN>SAP Cloud Identity Services now supports technical users—a new user type designed for non-human identities that enable secure, automated system-to-system communication and integrations. Technical users are managed separately from regular users through the new <EM>Technical Users</EM> tile under <EM>Users &amp; Authorizations</EM> in the administration console, making it easier to create, organize, and maintain service identities. For step-by-step instructions, &nbsp;see&nbsp;<A href="https://help.sap.com/docs/cloud-identity-services/cloud-identity-services/create-new-user-fd1a6362963a4fb6a627a0afb31ed99e?locale=en-US&amp;state=PRODUCTION&amp;version=Cloud" target="_blank" rel="noopener noreferrer">Managing Technical Users</A>. </SPAN></P><H2 id="toc-hId-1622712315"><SPAN>SAP Cloud Identity Services: Block and delete users</SPAN></H2><P><SPAN>Keeping your Identity Directory clean has just become easier. You can configure SAP Cloud Identity Services to automatically delete users who were created but never signed in to an application, helping reduce inactive accounts and simplify user lifecycle management. We’ve extended this functionality by adding a grace period. For configuration details, check <A href="https://help.sap.com/docs/cloud-identity-services/cloud-identity-services/block-or-delete-users-due-to-inactivity?version=Cloud" target="_blank" rel="noopener noreferrer">Block or Delete Users Due to Inactivity.</A></SPAN></P><H2 id="toc-hId-1426198810"><SPAN>SAP Cloud Identity Services: Automatic creation of Identity Provisioning tenants on SAP Cloud Identity for Neo tenants</SPAN></H2><P><SPAN>Starting June 10, 2026, SAP automatically creates a new Identity Provisioning tenant on the SAP Cloud Identity infrastructure for every existing Identity Provisioning tenant running on the Neo environment that is linked to a shared IAM tenant with Identity Authentication.</SPAN></P><P><SPAN>This automatic provisioning gives you access to the latest Identity Provisioning capabilities and configuration options available on the SAP Cloud Identity infrastructure—features that are not supported on Neo. The newly created tenant is used for integrations related to bundled SAP cloud solutions, helping prepare your landscape for future enhancements. For migration details, see</SPAN>&nbsp;<SPAN><A href="https://help.sap.com/docs/identity-provisioning/identity-provisioning/migrate-identity-provisioning-bundle-tenant?version=Cloud" target="_blank" rel="noopener noreferrer">Migrate Identity Provisioning Bundle Tenant</A></SPAN>.</P><H2 id="toc-hId-1229685305"><SPAN>SAP Secure Login Service for SAP GUI: Now available in China</SPAN></H2><P><SPAN>Organizations in China can now subscribe to the SAP Secure Login Service for SAP GUI and run the service on infrastructure located within China. This availability helps customers meet local deployment requirements while modernizing authentication for SAP GUI. They will be able to simplify integration by connecting more easily with enterprise identity providers, and strengthen security with enhanced support for multifactor authentication (MFA). </SPAN></P><P><SPAN>You can see the supported data centers <A href="https://help.sap.com/docs/SAP%20SECURE%20LOGIN%20SERVICE/c35917ca71e941c5a97a11d2c55dcacd/55cd045f3ddd442f93b0ca958bff0e07.html?cta_id=information-txt-right&amp;pttid=7895&amp;InteractionType=%7b%7blead.Contact+Profile+Status%7d%7d&amp;LID=%7b%7blead.p_encrypted_leadid%7d%7d" target="_blank" rel="noopener noreferrer">here</A>. For more information on the SAP Secure Login Service for SAP GUI, check the <A href="https://help.sap.com/docs/SAP%20SECURE%20LOGIN%20SERVICE/c35917ca71e941c5a97a11d2c55dcacd/28d654c4459d4693bbf34e5103867f97.html?version=Cloud" target="_blank" rel="noopener noreferrer">SAP Help Portal</A>. </SPAN></P><H2 id="toc-hId-1033171800"><SPAN>Application Vulnerability Report for SAP BTP </SPAN></H2><P><SPAN>In December 2025, SAP introduced the Application Vulnerability Report (beta) for SAP BTP, providing an API-driven way to identify open-source vulnerabilities in your Cloud Foundry applications.</SPAN></P><P><SPAN>The service has now been enhanced with its first <A href="https://community.sap.com/t5/technology-blog-posts-by-sap/visualize-your-application-vulnerabilities-in-the-btp-cockpit/ba-p/14380080" target="_blank">graphical user interface</A>, available directly in the SAP BTP Cockpit. The new interface features an intuitive findings dashboard with a severity breakdown, along with a detailed findings view that provides actionable remediation guidance to help you address identified vulnerabilities.</SPAN></P><P><SPAN>The Application Vulnerability Report is currently available as a beta service in the EU10 region. While subscriptions are not yet available in other SAP BTP landscapes, the service's <A href="https://community.sap.com/t5/technology-blog-posts-by-sap/application-vulnerability-report-now-scanning-your-applications-beyond-eu/ba-p/14393613" target="_blank">scanning scope</A> has been expanded significantly. It now scans applications deployed across 42 Cloud Foundry landscapes worldwide, including regions in the United States, Asia Pacific, Japan, Brazil, and additional European landscapes beyond the original EU10 region.</SPAN></P><H2 id="toc-hId-836658295"><SPAN>Stay in the loop</SPAN></H2><P><SPAN>Join the <A href="https://pages.community.sap.com/topics/btp-security" target="_blank" rel="noopener noreferrer">SAP BTP Security</A> and <A href="https://pages.community.sap.com/topics/cloud-identity-services" target="_blank" rel="noopener noreferrer">SAP Cloud Identity Services</A> communities to get updates, share feedback, and connect with others! </SPAN></P> 2026-07-10T10:32:22.335000+02:00 https://community.sap.com/t5/security-and-compliance-blog-posts/leading-the-way-for-post-quantum-cryptography/ba-p/14439479 Leading the Way for Post-Quantum Cryptography 2026-07-13T20:18:23.396000+02:00 SandipD https://community.sap.com/t5/user/viewprofilepage/user-id/77128 <P>&nbsp;<span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="crypto-agility-pqc.jpg" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/432591i23C565D4E7D06CC2/image-size/large?v=v2&amp;px=999" role="button" title="crypto-agility-pqc.jpg" alt="crypto-agility-pqc.jpg" /></span></P><P>&nbsp;</P><P><EM>By Sandip Dholakia, Chair Cryptography Innovation Hub, and Volkmar Lotz, Project Lead Crypto Agility Initiative, SAP</EM></P><P><BR />Quantum technologies are advancing rapidly, leading to a cryptographically relevant quantum computer that can break today’s public-key cryptography, which will be available sooner rather than later.</P><P>Like major industry peers, SAP is aware of the increased risk and is striving to be post-quantum ready by 2029 across its products, services and infrastructure. SAP has established a Cryptography Center or Excellence (CoE) that governs the migration process, maintains a cryptographic inventory, and coordinates migration projects across the company following a roadmap recognizing technical and business priorities for the identified cryptographic assets. Protecting customer data and privacy remains SAP’s highest priority, and to support this commitment, the SAP cryptography CoE has adopted a long-term strategy focused on cryptographic agility rather than one-off migration projects.</P><P>&nbsp;</P><H1 id="toc-hId-1690202784">The Risk</H1><P>Quantum computers can solve certain mathematical problems faster than classical computers. In 1994, Peter Shor demonstrated that a sufficiently powerful quantum computer could efficiently factor large integers and solve discrete logarithm problems. This breakthrough directly threatens widely used public-key cryptography algorithms, including RSA, Diffie-Hellman, and Elliptic Curve Cryptography (ECC) as their security relies on the difficulty of solving these problems with a classical computer. These algorithms form the foundation of many security mechanisms used across the industry, including within SAP products.</P><H2 id="toc-hId-1622771998"><BR />Why the Timeline Matters</H2><P>Although the cybersecurity professionals understood the threat for decades, momentum accelerated after the National Institute of Standards and Technology (NIST) proposed a timeline in 2024 to introduce Post-Quantum Cryptography (PQC) alongside traditional cryptography, starting in 2030 and fully phasing out traditional cryptography by 2035. This timeline is challenged by recent advances in quantum technologies: accelerated hardware development, improved quantum error correction and optimizations for Shor’s algorithm suggest that the gap between existing quantum computers and those needed to break public-key cryptography is closing. Considering these developments, SAP has raised the ambition to replace the current algorithms by quantum-resilient ones across its products, services and infrastructures by 2029.</P><P>This reflects an industry trend: Earlier in 2026, major industry peers, Google and Microsoft among them, announced plans to complete their PQC migration by 2029. In June 2026, the White House issued Executive Order 14412, requiring High Value Assets (HVAs) within U.S. federal agencies to be quantum-safe by the end of 2030.</P><H1 id="toc-hId-1297175774"><BR />The Challenge</H1><P>History shows that replacing cryptographic standards can take years, sometimes decades. Cryptographic protocols are deeply embedded in applications, infrastructure, communications, and operational processes. Even small changes can have far-reaching and unintended consequences. As a result, organizations often hesitate to take immediate action to perform necessary upgrades, increasing exposure to evolving threats.</P><P>SAP leverages cryptographic agility to implement a sustainable approach to meet evolving cryptographic requirements.</P><H1 id="toc-hId-1100662269"><BR />Cryptographic Agility at SAP</H1><P>SAP’s strategy is built around cryptographic agility—the ability to adapt quickly to future cryptographic changes without major disruption. SAP is implementing a phased enterprise-wide approach:</P><P>• Governance: The Cryptography CoE provides executive oversight, establishes milestones, defines success metrics, and guides product teams.<BR />• Inventory: Teams identify cryptographic assets and generate Cryptographic Bills of Materials (CBoMs) using industry-standard tools and CycloneDX formats.<BR />• Prioritization: Assets are ranked based on criticality to guide migration planning. This takes into account that some types of attacks can be launched already today, for instance, collecting encrypted data in transit for later decryption with a quantum computer (“harvest now, decrypt later”)<BR />• Implementation: PQC algorithms are introduced in phases, following established roadmaps reflecting the prioritization.<BR />• Validation: New implementations undergo rigorous testing before production deployment.</P><P>Over time, these capabilities will become automated and embedded into SAP’s Secure Software Development and Operations Lifecycle (SecureSDOL).</P><H1 id="toc-hId-904148764"><BR />SAP’s Position</H1><P>• Taking recent developments in quantum technology into account, SAP strives to become post-quantum cryptography ready by 2029.<BR />• SAP is actively advancing toward quantum resistance and aligning with emerging regulatory and industry expectations. The company’s primary focus is on adopting NIST-recommended PQC algorithms while remaining open to other industry-proven solutions where appropriate.<BR />• SAP has already released an updated Common Cryptographic Library (v8.6.4) that includes PQC capabilities for product teams. At present, SAP does not anticipate significant performance or cost impacts for customers, partners, or vendors during the migration.</P><P><U>SAP’s objective is: protect products, services, and customer data against evolving threats while delivering secure, resilient, and future-ready solutions in the post-quantum era.</U></P> 2026-07-13T20:18:23.396000+02:00 https://community.sap.com/t5/technology-blog-posts-by-members/from-code-to-strategy-how-mcp-cpi-and-lightweight-agents-unlock-ai-driven/ba-p/14443320 From Code to Strategy: How MCP, CPI, and Lightweight Agents Unlock AI‑Driven SAP Integrations 2026-07-17T17:58:20.038000+02:00 dibyajyoti_nanda https://community.sap.com/t5/user/viewprofilepage/user-id/184938 <H3 id="toc-hId-1949111872"><STRONG>Introduction</STRONG></H3><P><SPAN>SAP Cloud Platform Integration (CPI) allows enterprises to connect diverse systems through <STRONG>iFlows</STRONG> — integration flows that define how data moves and transforms between endpoints. By combining CPI with the <STRONG>Model Context Protocol (MCP)</STRONG> and a lightweight <STRONG>Agent</STRONG>, we can expose SAP processes as consumable services — enabling seamless orchestration, automation, and intelligent interaction across enterprise systems.</SPAN></P><DIV>&nbsp;</DIV><H3 id="toc-hId-1752598367"><STRONG>Understanding the Components</STRONG></H3><H4 id="toc-hId-1685167581"><STRONG>SAP Cloud Platform Integration (CPI)</STRONG></H4><P><SPAN>SAP CPI is the <STRONG>integration backbone</STRONG> of the SAP ecosystem. It enables secure, scalable, and real-time data exchange between SAP and non-SAP systems. In this architecture, CPI acts as the <STRONG>execution layer</STRONG>, where business logic resides. The iFlow processes requests coming from the MCP Server, performs necessary transformations, and interacts with SAP backend systems such as <STRONG>S/4HANA</STRONG>, <STRONG>SuccessFactors</STRONG>, or <STRONG>Finance</STRONG> modules.</SPAN></P><P><SPAN><STRONG>In the AI world:</STRONG> CPI provides the <STRONG>structured data foundation</STRONG> that intelligent agents rely on. By exposing iFlows as APIs, it allows AI systems to access enterprise data securely and contextually — bridging traditional ERP with modern AI-driven automation.</SPAN></P><DIV>&nbsp;</DIV><H4 id="toc-hId-1488654076"><STRONG>Model Context Protocol (MCP) Server</STRONG></H4><P><SPAN>The MCP Server is the <STRONG>middleware bridge</STRONG> between the Agent and SAP CPI. It defines “tools” — essentially API endpoints — that the Agent can call to trigger specific SAP processes. It handles authentication, routing, and error management, ensuring that requests from the Agent are properly formatted and securely transmitted to CPI.</SPAN></P><P><SPAN><STRONG>In the AI world:</STRONG> MCP acts as the <STRONG>contextual translator</STRONG> between natural language and enterprise APIs. It enables AI agents to understand what business functions are available and how to invoke them, making enterprise systems conversational and intelligent.</SPAN></P><DIV>&nbsp;</DIV><H4 id="toc-hId-1292140571"><STRONG>Copilot Agent</STRONG></H4><P><SPAN>The Agent is the <STRONG>frontline interface</STRONG> — a lightweight application (built with FastAPI or similar frameworks) that interacts with users or other systems. It consumes the MCP tools and provides a simple way to trigger SAP processes, either through a web UI or API calls.</SPAN></P><P><SPAN><STRONG>In the AI world:</STRONG> The Agent represents the <STRONG>intelligence layer</STRONG> — capable of interpreting user intent, orchestrating workflows, and connecting to enterprise data through MCP and CPI. It’s the component that transforms static APIs into dynamic, AI-driven interactions.</SPAN></P><DIV>&nbsp;</DIV><H3 id="toc-hId-966544347"><STRONG>Key Steps</STRONG></H3><H4 id="toc-hId-899113561"><STRONG>1. Expose the iFlow in SAP CPI</STRONG></H4><UL><LI><P><SPAN>Design and deploy your iFlow (e.g., invoice retrieval or employee data).</SPAN></P></LI><LI><P><SPAN>Ensure it’s accessible via HTTPS with proper authentication.</SPAN></P></LI></UL><H4 id="toc-hId-702600056"><STRONG>2. Create the MCP Server</STRONG></H4><UL><LI><P><SPAN>Define tools mapping to CPI endpoints.</SPAN></P></LI><LI><P><SPAN>Configure the MCP server to expose these tools securely.</SPAN></P></LI><LI><P><SPAN>Example endpoint: <CODE><A href="http://localhost:8000/tools/sayHello" target="_blank" rel="noopener nofollow noreferrer">http://localhost:8000/tools/sayHello</A></CODE></SPAN></P></LI></UL><H4 id="toc-hId-506086551"><STRONG>3. Consume with an Agent</STRONG></H4><UL><LI><P><SPAN>Build a lightweight Agent using FastAPI.</SPAN></P></LI><LI><P><SPAN>Connect it to the MCP server and expose an endpoint like <CODE><A href="http://localhost:9000/agent/sayHello" target="_blank" rel="noopener nofollow noreferrer">http://localhost:9000/agent/sayHello</A></CODE>.</SPAN></P></LI><LI><P><SPAN>Provide a simple UI for users to trigger CPI processes.</SPAN></P></LI></UL><DIV>&nbsp;</DIV><H3 id="toc-hId-180490327"><STRONG>Tools Used</STRONG></H3><UL><LI><P><SPAN><STRONG>SAP CPI</STRONG> → iFlow design and deployment</SPAN></P></LI><LI><P><SPAN><STRONG>MCP Server</STRONG> → Tool definition and orchestration</SPAN></P></LI><LI><P><SPAN><STRONG>FastAPI</STRONG> → Agent development</SPAN></P></LI><LI><P><SPAN><STRONG>OAuth2 / SAP IAS</STRONG> → Authentication and security</SPAN></P></LI></UL><DIV>&nbsp;</DIV><H3 id="toc-hId--91254547"><STRONG>Architecture Overview</STRONG></H3><P><SPAN>Embed your architecture diagram here showing the flow: <STRONG>User → Copilot Agent → MCP Server → SAP CPI → SAP Backend Systems</STRONG></SPAN></P><BLOCKQUOTE><P><SPAN><EM>Figure 1: End-to-end architecture connecting the Agent, MCP Server, and SAP CPI iFlow.</EM></SPAN></P></BLOCKQUOTE><DIV><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="dibyajyoti_nanda_4-1784294611769.png" style="width: 490px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/434394iA5303BFED911F2CA/image-dimensions/490x327?v=v2" width="490" height="327" role="button" title="dibyajyoti_nanda_4-1784294611769.png" alt="dibyajyoti_nanda_4-1784294611769.png" /></span><H3 id="toc-hId--287768052"><STRONG>Step: Create a Simple iFlow in SAP CPI</STRONG></H3><P><SPAN>Design a basic iFlow in <STRONG>SAP Cloud Platform Integration (CPI)</STRONG> that accepts a name as input payload and returns a greeting message. For example, if the payload contains <CODE>"Dibyajyoti"</CODE>, the iFlow should respond with <CODE>"Hello Dibyajyoti"</CODE>.</SPAN></P><P><SPAN>Once the development is complete, <STRONG>deploy the iFlow</STRONG> to generate the endpoint URL. This URL will be used later by the MCP Server and Copilot Agent to invoke the iFlow and integrate it into the overall architecture.</SPAN></P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="dibyajyoti_nanda_5-1784295101195.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/434402i90A5EE7E6B434C10/image-size/medium?v=v2&amp;px=400" role="button" title="dibyajyoti_nanda_5-1784295101195.png" alt="dibyajyoti_nanda_5-1784295101195.png" /></span><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="dibyajyoti_nanda_6-1784295120142.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/434403iAB4E8A144462FEB0/image-size/medium?v=v2&amp;px=400" role="button" title="dibyajyoti_nanda_6-1784295120142.png" alt="dibyajyoti_nanda_6-1784295120142.png" /></span><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="dibyajyoti_nanda_7-1784295136670.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/434404iAEC61509E632E8AF/image-size/medium?v=v2&amp;px=400" role="button" title="dibyajyoti_nanda_7-1784295136670.png" alt="dibyajyoti_nanda_7-1784295136670.png" /></span><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="dibyajyoti_nanda_8-1784295234623.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/434405iE7C313C390079338/image-size/medium?v=v2&amp;px=400" role="button" title="dibyajyoti_nanda_8-1784295234623.png" alt="dibyajyoti_nanda_8-1784295234623.png" /></span><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="dibyajyoti_nanda_9-1784295250406.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/434406iFB38F890953214D3/image-size/medium?v=v2&amp;px=400" role="button" title="dibyajyoti_nanda_9-1784295250406.png" alt="dibyajyoti_nanda_9-1784295250406.png" /></span><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="dibyajyoti_nanda_10-1784295397082.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/434408i5C54642D897DF8E5/image-size/medium?v=v2&amp;px=400" role="button" title="dibyajyoti_nanda_10-1784295397082.png" alt="dibyajyoti_nanda_10-1784295397082.png" /></span><P><EM><STRONG>"<A target="_blank" rel="noopener">https://&lt;SUBACCOUNT&gt;.it-cpitrial06-rt.cfapps.us10-001.hana.ondemand.com/http/hello</A>"</STRONG></EM></P><H3 id="toc-hId--484281557"><STRONG>Step 2: Test the iFlow Endpoint in Postman</STRONG></H3><P><SPAN>Once the iFlow is deployed in <STRONG>SAP CPI</STRONG>, you’ll receive an endpoint URL. To validate it, use <STRONG>Postman</STRONG>:</SPAN></P><OL><LI><P><SPAN><STRONG>Open Postman</STRONG> and create a new request.</SPAN></P></LI><LI><P><SPAN><STRONG>Set the method</STRONG> to <CODE>POST</CODE> (or <CODE>GET</CODE>, depending on your iFlow design).</SPAN></P></LI><LI><P><SPAN><STRONG>Enter the endpoint URL</STRONG> generated during deployment (e.g., <CODE><A href="https://cpi.example.com/http/endpoint/sayHello" target="_blank" rel="noopener nofollow noreferrer">https://cpi.example.com/http/endpoint/sayHello</A></CODE>).</SPAN></P></LI><LI><P><SPAN><STRONG>Authentication:</STRONG></SPAN></P><UL><LI><P><SPAN><STRONG>Username</STRONG> → <EM>Client ID</EM></SPAN></P></LI><LI><P><SPAN><STRONG>Password</STRONG> → <EM>Client Secret</EM> These credentials are provided when you configure the CPI tenant and are required for secure access.</SPAN></P></LI></UL></LI><LI><P><SPAN><STRONG>Payload:</STRONG></SPAN></P><UL><LI><P><SPAN>In the request body, pass the input JSON or text payload (e.g., <CODE>{ "name": "Dibyajyoti" }</CODE>).</SPAN></P></LI></UL></LI><LI><P><SPAN><STRONG>Send the request</STRONG> and verify the response.</SPAN></P><UL><LI><P><SPAN>Expected output: <CODE>Hello Dibyajyoti</CODE></SPAN></P></LI></UL></LI></OL><DIV>&nbsp;</DIV><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="dibyajyoti_nanda_11-1784299427248.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/434424i64731458EA637742/image-size/medium?v=v2&amp;px=400" role="button" title="dibyajyoti_nanda_11-1784299427248.png" alt="dibyajyoti_nanda_11-1784299427248.png" /></span><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="dibyajyoti_nanda_12-1784299487199.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/434426i601582FD395FCE7A/image-size/medium?v=v2&amp;px=400" role="button" title="dibyajyoti_nanda_12-1784299487199.png" alt="dibyajyoti_nanda_12-1784299487199.png" /></span><H3 id="toc-hId--680795062"><STRONG>Step 3: Set Up the MCP Environment</STRONG></H3><P><SPAN>Before working with the <STRONG>MCP Server</STRONG>, ensure your development environment is ready. You’ll need the following installed on your system:</SPAN></P><UL><LI><P><SPAN><STRONG>Python</STRONG> (version 3.9 or above recommended)</SPAN></P></LI><LI><P><SPAN><STRONG>PIP</STRONG> (Python package manager)</SPAN></P></LI><LI><P><SPAN><STRONG>Visual Studio Code</STRONG> (for editing and running your project)</SPAN></P></LI></UL><SPAN><BR /></SPAN><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="dibyajyoti_nanda_13-1784299722448.png" style="width: 605px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/434429iDF254624CB2A7562/image-dimensions/605x62?v=v2" width="605" height="62" role="button" title="dibyajyoti_nanda_13-1784299722448.png" alt="dibyajyoti_nanda_13-1784299722448.png" /></span><H3 id="toc-hId--877308567"><STRONG>Step 4: Create the Project Folder Structure</STRONG></H3><P><SPAN>To organize your MCP setup, create the following folders:</SPAN></P><OL><LI><P><SPAN><STRONG>Main Project Folder</STRONG></SPAN></P><UL><LI><P><SPAN>Name: <CODE>MCPPROJECT</CODE></SPAN></P></LI></UL></LI><LI><P><SPAN><STRONG>Subfolders inside MCPPROJECT</STRONG></SPAN></P><UL><LI><P><SPAN><CODE>SAP_MCP_SERVER</CODE> → Contains the MCP Server files (<CODE>server.py</CODE>, <CODE>.env</CODE>, <CODE>requirements.txt</CODE>)</SPAN></P></LI><LI><P><SPAN><CODE>COPILOT_AGENT</CODE> → Contains the Agent files (<CODE>agent.py</CODE>, <CODE>templates/index.html</CODE>, <CODE>requirements.txt</CODE>)</SPAN></P></LI></UL></LI></OL><DIV>&nbsp;</DIV><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="dibyajyoti_nanda_14-1784299918697.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/434434iCC4D380C523F4F19/image-size/medium?v=v2&amp;px=400" role="button" title="dibyajyoti_nanda_14-1784299918697.png" alt="dibyajyoti_nanda_14-1784299918697.png" /></span><P>SAP_MCP_SERVER</P><P>.env----&gt;</P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="dibyajyoti_nanda_15-1784300103035.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/434436iC88E70775838E1F6/image-size/medium?v=v2&amp;px=400" role="button" title="dibyajyoti_nanda_15-1784300103035.png" alt="dibyajyoti_nanda_15-1784300103035.png" /></span><P>requirements.txt----&gt;</P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="dibyajyoti_nanda_16-1784300159824.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/434438iE1F49CC6A1687674/image-size/medium?v=v2&amp;px=400" role="button" title="dibyajyoti_nanda_16-1784300159824.png" alt="dibyajyoti_nanda_16-1784300159824.png" /></span><P>server.py----&gt;</P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="dibyajyoti_nanda_17-1784300241832.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/434439iBFBBD07060649912/image-size/medium?v=v2&amp;px=400" role="button" title="dibyajyoti_nanda_17-1784300241832.png" alt="dibyajyoti_nanda_17-1784300241832.png" /></span><P>COPILOT_AGENT</P><P>requirements.txt------&gt;</P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="dibyajyoti_nanda_18-1784300469320.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/434440i22E5E786FC517075/image-size/medium?v=v2&amp;px=400" role="button" title="dibyajyoti_nanda_18-1784300469320.png" alt="dibyajyoti_nanda_18-1784300469320.png" /></span><P>agent.py-------&gt;</P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="dibyajyoti_nanda_19-1784300534035.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/434441iA29826F9DBDEE34C/image-size/medium?v=v2&amp;px=400" role="button" title="dibyajyoti_nanda_19-1784300534035.png" alt="dibyajyoti_nanda_19-1784300534035.png" /></span><P>create a subfolder</P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="dibyajyoti_nanda_20-1784300619452.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/434443i2828BB8EF9658A07/image-size/medium?v=v2&amp;px=400" role="button" title="dibyajyoti_nanda_20-1784300619452.png" alt="dibyajyoti_nanda_20-1784300619452.png" /></span><P>index.html---------&gt;</P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="dibyajyoti_nanda_21-1784300688972.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/434444iBFE833D14856B85F/image-size/medium?v=v2&amp;px=400" role="button" title="dibyajyoti_nanda_21-1784300688972.png" alt="dibyajyoti_nanda_21-1784300688972.png" /></span><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="dibyajyoti_nanda_22-1784300730982.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/434446i5262693F41DF3032/image-size/medium?v=v2&amp;px=400" role="button" title="dibyajyoti_nanda_22-1784300730982.png" alt="dibyajyoti_nanda_22-1784300730982.png" /></span><P>&nbsp;</P><H3 id="toc-hId--1073822072"><STRONG>Step 5: Run the MCP Server and Copilot Agent</STRONG></H3><H4 id="toc-hId--1563738584"><STRONG>Inside </STRONG><CODE>sap_mcp_server</CODE></H4><P><SPAN>Install dependencies and start the MCP Server:</SPAN></P></DIV><pre class="lia-code-sample language-bash"><code>pip install -r requirements.txt uvicorn server:app --reload --port 8000</code></pre><P>&nbsp;</P><UL><LI><P><SPAN><CODE>pip install -r requirements.txt</CODE> → Installs all required Python packages.</SPAN></P></LI><LI><P><SPAN><CODE>uvicorn server:app --reload --port 8000</CODE> → Launches the MCP Server on port <STRONG>8000</STRONG> with auto-reload enabled.</SPAN></P></LI></UL><H4 id="toc-hId--1760252089"><STRONG>Inside </STRONG><CODE>copilot_agent</CODE></H4><P><SPAN>Install dependencies and start the Copilot Agent:</SPAN></P><pre class="lia-code-sample language-bash"><code>pip install -r requirements.txt uvicorn agent:app --reload --port 9000 ​</code></pre><P>&nbsp;</P><UL><LI><P><SPAN><CODE>pip install -r requirements.txt</CODE> → Installs Agent dependencies.</SPAN></P></LI><LI><P><SPAN><CODE>uvicorn agent:app --reload --port 9000</CODE> → Launches the Agent on port <STRONG>9000</STRONG> with auto-reload enabled.</SPAN></P></LI></UL><H4 id="toc-hId--1956765594"><STRONG>Test the Agent</STRONG></H4><P><SPAN>Once both services are running, open the Agent URL in your browser:</SPAN></P><pre class="lia-code-sample language-markup"><code>http://localhost:9000/</code></pre><P>&nbsp;This will load the Agent’s web interface, allowing you to trigger the MCP tools and ultimately invoke the SAP CPI iFlow.</P><P>&nbsp;</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="dibyajyoti_nanda_23-1784301717047.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/434452i1F3CE18849D4B984/image-size/medium?v=v2&amp;px=400" role="button" title="dibyajyoti_nanda_23-1784301717047.png" alt="dibyajyoti_nanda_23-1784301717047.png" /></span></P><H3 id="toc-hId--1859876092"><STRONG>Conclusion</STRONG></H3><P><SPAN>By exposing SAP CPI iFlows through an MCP Server and consuming them with an Agent, enterprises can create a <STRONG>modular, API-driven integration layer</STRONG>. This approach simplifies access to SAP processes, improves reusability, and lays the foundation for <STRONG>AI-powered enterprise automation</STRONG> — where intelligent agents can interact with SAP systems naturally, securely, and efficiently.</SPAN></P><P>Regards,</P><P>Dibyajyoti Nanda</P><P><A href="https://www.linkedin.com/in/dibyajyoti-nanda-23907429/" target="_blank" rel="nofollow noopener noreferrer">https://www.linkedin.com/in/dibyajyoti-nanda-23907429/</A></P><P>&nbsp;</P> 2026-07-17T17:58:20.038000+02:00 https://community.sap.com/t5/technology-blog-posts-by-sap/upcoming-expert-guided-implementation-egis-for-cloud-alm-and-security/ba-p/14444356 🚀Upcoming Expert-guided Implementation (EGIs) for Cloud ALM and Security: August 2026 2026-07-20T12:08:12.454000+02:00 AnisaTuscano https://community.sap.com/t5/user/viewprofilepage/user-id/2003264 <P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="EGI Blog banner.jpg" style="width: 930px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/435019i410FFDECB74AA924/image-dimensions/930x321?v=v2" width="930" height="321" role="button" title="EGI Blog banner.jpg" alt="EGI Blog banner.jpg" /></span></P><P>Supercharge your SAP outcomes this August 2026 with live, instructor-led Expert-guided Implementation (EGI) sessions - focused on rapid adoption of SAP Cloud ALM and stronger Security. Achieve faster time-to-value, reduce risk, and apply best practices immediately - all included with your SAP Enterprise Support or SAP Enterprise Support, Cloud Edition at no extra cost. Ready to move from learning to results? Reserve your spot now. For more details on this service, please refer to the following <A href="https://learning.sap.com/enterprise-support/egi" target="_blank" rel="noopener noreferrer">here</A>.&nbsp;</P><P>&nbsp;</P><TABLE width="100%"><TBODY><TR><TD width="193"><P>EGI registration link</P></TD><TD width="407"><P>Schedule</P></TD></TR><TR><TD width="193"><P><A href="https://saplearninghub.plateau.com/learning/user/common/viewItemDetails.do?componentID=SUP_EDE_0080_1312&amp;componentTypeID=EXPERT_LED&amp;fromSF=Y&amp;revisionDate=1357992000000&amp;menuGroup=Learning&amp;menuItem=Cur&amp;fromDeepLink=true&amp;hideItemDetailsBackLink=true#/7BED234FF4051B10E053174E020A7F44/classlist" target="_blank" rel="noopener nofollow noreferrer">EGI: Roles and Authorization Concept</A></P></TD><TD width="407"><P>NA&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;English&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;17–21 August 2026, 11:00 – 13:00&nbsp; America/New York&nbsp;<BR />LA&nbsp; &nbsp; &nbsp; &nbsp; Spanish&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;24–28 August 2026, 10:00 – 12:00&nbsp; America/Mexico City<BR />EMEA&nbsp; &nbsp; English&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 31 August – 4 September 2026, 10:00 – 12:00&nbsp; Europe/Berlin<BR /><BR /></P></TD></TR><TR><TD width="193"><P><A href="https://saplearninghub.plateau.com/learning/user/deeplink.do?linkId=ITEM_DETAILS&amp;componentID=SUP_EDE_0330_1312&amp;componentTypeID=EXPERT_LED&amp;fromSF=Y&amp;revisionDate=1357992000000#/7BED234FF12E1B10E053174E020A7F44/classdetails/73169" target="_blank" rel="noopener nofollow noreferrer">EGI: Security Optimization Service (SOS) </A></P></TD><TD width="407"><P>EMEA&nbsp; &nbsp; English&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 31 August – 3 September 2026, 10:00 – 12:00&nbsp; Europe/Berlin<BR /><BR /></P></TD></TR><TR><TD width="193"><P><A href="https://saplearninghub.plateau.com/learning/user/common/viewItemDetails.do?OWASP_CSRFTOKEN=FDH7-6S7O-CW1A-WZC1-OAD2-XT8A-CLZP-OWF3&amp;componentID=SUP_EDE_0010_0123&amp;componentTypeID=EXPERT_LED&amp;fromSF=Y&amp;revisionDate=1673378220000&amp;menuGroup=Learning&amp;menuItem=Cur&amp;fromDeepLink=true&amp;hideItemDetailsBackLink=true#/DDC9DDD01CDB795718005D42E3A0C501/classlist" target="_blank" rel="noopener nofollow noreferrer">EGI: Implementing an SAP Security Baseline Dashboard </A></P></TD><TD width="407"><P>NA&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; English&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;10–14 August 2026,&nbsp;11:00 – 13:00&nbsp; America/New York<BR />EMEA&nbsp; &nbsp; &nbsp;English &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;24-28 August 2026, 10:00 – 12:00&nbsp; Europe/Berlin<BR /><BR /><BR /></P></TD></TR><TR><TD width="193"><P><A href="https://saplearninghub.plateau.com/learning/user/deeplink.do?linkId=ITEM_DETAILS&amp;componentID=SUP_EDE_0010_0222&amp;componentTypeID=EXPERT_LED&amp;fromSF=Y&amp;revisionDate=1646399160000#/CBEA650183EA76F3170097026D4E85DD/classlist" target="_blank" rel="noopener nofollow noreferrer">EGI: All you need to know about SAP Cloud ALM </A></P></TD><TD width="407"><P>EMEA&nbsp; &nbsp; &nbsp;English&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 03–07 August 2026, 10:00 – 12:00&nbsp; Europe/Berlin<BR />APJ&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Chinese&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 17–21 August 2026, 10:00 – 12:00&nbsp; Asia/Shanghai<BR />NA&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; English&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 10–14 August 2026,&nbsp;11:00 – 13:00&nbsp; America/New York</P><P>APJ&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Japanese&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 03- 07 &nbsp;August 2026, 10:00 – 12:00&nbsp; Asia/Tokyo</P><P>EMEA&nbsp; &nbsp; English&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 31 August – 4 September 2026, 10:00 – 12:00&nbsp; Europe/Berlin</P><P>LA&nbsp; &nbsp; Spanish&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 31 August – 4 September 2026, 10:00 – 12:00&nbsp; America/Mexico City</P><P>LA&nbsp; &nbsp; &nbsp; &nbsp; Portuguese&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;24–28 August 2026, 09:00 – 11:00&nbsp; America/Sao Paulo</P><P><BR /><BR /></P></TD></TR><TR><TD width="193"><P>&nbsp;</P><P><A href="https://saplearninghub.plateau.com/learning/user/deeplink.do?linkId=ITEM_DETAILS&amp;componentID=SUP_EDE_00010183&amp;componentTypeID=EXPERT_LED&amp;fromSF=Y&amp;revisionDate=1745928164000#/2E2057E035EF8C5A19005D421D7D9F74/classlist" target="_blank" rel="noopener nofollow noreferrer">EGI: Selective Data Transfer (from SAP Solution Manager) to SAP Cloud ALM </A></P></TD><TD width="407"><P>&nbsp;</P><P>NA&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;English&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 04 – 06 August 2026, 11:00 – 13:00&nbsp; America/New York</P><P>LA&nbsp; &nbsp; Portuguese&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 31 August – 2 September 2026, 09:00 – 11:00&nbsp; America/Sao Paulo</P><P><BR /><BR /></P></TD></TR></TBODY></TABLE><P><STRONG>Important to Note:</STRONG></P><P>Browse all available topics in the SAP Enterprise Support Academy <A href="https://learning.sap.com/search?access=enterpriseSupport&amp;objType=live-event&amp;page=1" target="_blank" rel="noopener noreferrer">EGI Catalog</A>.&nbsp;</P><P>Note:&nbsp;Some sessions require a minimum number of participants to run. In such cases, cancellation notifications are sent by email.</P><P><STRONG>Enhance Your SAP Experience with Value Maps</STRONG></P><P>Beyond Expert-guided Implementation sessions, SAP Enterprise Support offers additional resources to help you drive innovation.&nbsp;<A href="https://community.sap.com/t5/sap-cloud-alm-cross-solution-topics-value-map/gh-p/alm-cross-vm" target="_blank">SAP Cloud ALM &amp; Cross-Solution Topics Value Map </A>bring together guidance, recommended actions, and supporting resources to help you decide what to focus on next - all included in your SAP cloud subscription.</P><P>Watch our&nbsp;<A href="https://sapvideo.cfapps.eu10-004.hana.ondemand.com/?entry_id=1_n9gri9t0" target="_blank" rel="noopener nofollow noreferrer">short demo video</A>, then head over to&nbsp;<A href="https://pages.community.sap.com/resources/enterprise-support-value-maps" target="_blank" rel="noopener noreferrer">our page</A>&nbsp;to explore our range of topics and&nbsp;<A href="https://forms.office.com/Pages/ResponsePage.aspx?id=bGf3QlX0PEKC9twtmXka9wYnhDAeiNtCufwRckBCmq1UNUpFVElUN1JFVkZOSFpINUoyRUVFVlVPVyQlQCN0PWcu" target="_blank" rel="noopener nofollow noreferrer">request a call</A>&nbsp;with a topic expert&nbsp;for guidance tailored to your goals. &nbsp;</P><P><STRONG>About the author:</STRONG>&nbsp;</P><P>Anisa Tuscano is a&nbsp;Topic Expert&nbsp;for SAP Enterprise Support value maps, specializing in SAP Cloud ALM and Security. Anisa is passionate about helping customers succeed through SAP Enterprise Support offerings.&nbsp;</P><P><span class="lia-unicode-emoji" title=":light_bulb:">💡</span>Have&nbsp;<STRONG>questions</STRONG>&nbsp;or&nbsp;<STRONG>feedback</STRONG>&nbsp;around this content?&nbsp;Don’t&nbsp;hesitate to&nbsp;comment down&nbsp;below or contact <a href="https://community.sap.com/t5/user/viewprofilepage/user-id/2003264">@AnisaTuscano</a>&nbsp;.&nbsp;</P> 2026-07-20T12:08:12.454000+02:00 https://community.sap.com/t5/sap-cap-blog-posts/building-cpi-explorer-my-journey-to-simplify-searching-sap-integration/ba-p/14439630 Building CPI Explorer – My Journey to Simplify Searching SAP Integration Suite iFlows 2026-07-20T12:12:08.365000+02:00 lokesh_bhukya https://community.sap.com/t5/user/viewprofilepage/user-id/1585211 <H1 id="toc-hId-1690204573">Building CPI Explorer – My Journey to Simplify Searching SAP Integration Suite iFlows</H1><H2 id="toc-hId-1622773787">Introduction</H2><P>As an SAP Integration Suite consultant, a large part of my day involves supporting existing integrations, troubleshooting production issues, and understanding how different systems are connected. One challenge kept coming up repeatedly: finding where a particular SFTP directory, HTTP endpoint, ProcessDirect endpoint, or credential was configured across dozens (sometimes hundreds) of Integration Flows.</P><P>SAP's Design-Time APIs let you retrieve Integration Packages and Integration Flows, but there's no built-in way to search adapter configurations across an entire tenant. In practice, that meant opening package after package and manually inspecting each iFlow — slow, repetitive, and easy to get wrong in a large landscape.</P><P>Instead of continuing to do this by hand, I decided to build a tool to solve it for myself, and hopefully for other developers too.</P><H2 id="toc-hId-1426260282">Where It All Started</H2><P>I started my career as an ABAP developer, and one feature I relied on constantly was the "Where Used" list. If I needed to know where a table, function module, or field was being used, I could just look it up. It was simple, fast, and always available.</P><P>When I moved into PI/PO and later CPI, that convenience disappeared. There's no equivalent way to instantly search where something is used across your integration landscape.</P><P>This became a real problem in day-to-day support. An FICO or SD colleague would come to me and say "my file isn't moving, can you check?" Half the time, they weren't even sure whether their interface was flowing through PI/CPI at all — they just knew something was stuck and assumed I'd know where to look. Other times, someone from the infra team would ask "are we using this host anywhere? We need to update it" or "can you find every flow using this username, we're rotating credentials." Each of these meant manually opening iFlow after iFlow, hoping I didn't miss one.</P><P>That's where the idea for CPI Explorer actually came from — not as a big architectural vision, but as a way to get back something as basic as the ABAP "Where Used" list, just for CPI.</P><P>One real example was during an infrastructure change where we had to update an SFTP host. Before CPI Explorer, the only option was to manually open multiple Integration Flows and inspect every SFTP adapter. With CPI Explorer, I can simply search for the hostname and immediately see every Integration Flow that references it.</P><H2 id="toc-hId-1229746777">The Idea</H2><P>The question I started with was simple:</P><P>&nbsp;</P><DIV><DIV><STRONG>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Can I build a "Where Used" list for CPI?</STRONG></DIV></DIV><P class="">I spent quite some time exploring the SAP Business Accelerator Hub and Design-Time APIs to see whether this functionality already existed. The Design-Time APIs gave me metadata, but not the adapter-level detail I needed. So I went a level deeper: download each Integration Flow artifact, extract the <CODE>.iflw</CODE> file, parse the XML, and build a local searchable index from it.</P><P class="">Once that was working, I wrapped it in a Chrome Extension so I could search directly from the browser instead of running scripts every time.</P><H2 id="toc-hId-1033233272">How CPI Explorer Works</H2><P>At a high level, the tool:</P><UL><LI>Authenticates with SAP Integration Suite using OAuth</LI><LI>Retrieves Integration Packages and Integration Flows via the Design-Time APIs</LI><LI>Downloads Integration Flow artifacts</LI><LI>Extracts and parses the <CODE>.iflw</CODE> XML files</LI><LI>Builds a searchable metadata index</LI><LI>Lets you search adapter properties from the Chrome Extension</LI></UL><P>It currently supports searching for:</P><UL><LI>SFTP directories</LI><LI>Host names</LI><LI>HTTP endpoints</LI><LI>ProcessDirect endpoints</LI><LI>JMS queues</LI><LI>Credentials</LI><LI>Externalized parameters</LI><LI>Other adapter properties</LI></UL><H2 id="toc-hId-836719767">What I Learned</H2><P>Building this taught me more than I expected about:</P><UL><LI>SAP Integration Suite Design-Time APIs</LI><LI>The structure of Integration Flow artifacts</LI><LI>Parsing <CODE>.iflw</CODE> XML files</LI><LI>Chrome Extension development</LI><LI>Organizing a Node.js application into reusable modules</LI></UL><P>The trickiest part was making sure every downloaded artifact mapped back correctly to its source Integration Flow while the index was being built. Getting that mapping right was what made the search results trustworthy across a whole tenant.</P><H2 id="toc-hId-640206262">Why I'm Sharing This</H2><P>I built CPI Explorer to solve my own problem, but I believe many SAP Integration Suite developers face the same challenge. That's why I decided to make it open source, so others can use it, contribute ideas, and help improve it over time.</P><H2 id="toc-hId-443692757">GitHub</H2><P>The project is available here: <STRONG><A href="https://github.com/lokeshbhukya2019-netizen/cpi-explorer" target="_blank" rel="noopener nofollow noreferrer">https://github.com/lokeshbhukya2019-netizen/cpi-explorer</A></STRONG></P><P>Feedback, suggestions, and contributions are welcome.</P><H2 id="toc-hId-247179252">What's Next</H2><P>A few things I'm planning to add:</P><UL><LI>Search by adapter type</LI><LI>Multi-tenant support</LI><LI>Export to Excel/CSV</LI><LI>Dependency visualization</LI><LI>Support for additional adapter types</LI></UL><P>If you have ideas for other useful features, I'd like to hear them.</P><H2 id="toc-hId-50665747">Closing Thoughts</H2><P>CPI Explorer started as an attempt to fix a problem I ran into constantly in day-to-day SAP Integration Suite work. Along the way it turned into a good excuse to learn more about SAP's APIs, artifact structures, and browser extension development.</P><P>I hope it saves other SAP Integration Suite developers some time during troubleshooting and impact analysis. If you try it, I'd genuinely like to hear how it goes.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Screenshot 2026-07-10 031749.png" style="width: 721px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/432614i4A9B3462B2B87055/image-size/large?v=v2&amp;px=999" role="button" title="Screenshot 2026-07-10 031749.png" alt="Screenshot 2026-07-10 031749.png" /></span></P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Screenshot 2026-07-10 024832.png" style="width: 557px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/432612i2B1DD0E9BD52910B/image-size/large?v=v2&amp;px=999" role="button" title="Screenshot 2026-07-10 024832.png" alt="Screenshot 2026-07-10 024832.png" /></span></P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Screenshot 2026-07-10 031943.png" style="width: 559px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/432613iE4BF543F79FB6D8B/image-size/large?v=v2&amp;px=999" role="button" title="Screenshot 2026-07-10 031943.png" alt="Screenshot 2026-07-10 031943.png" /></span></P><P>Thank you for taking the time to read about CPI Explorer. If you try it out, I'd love to hear your feedback, suggestions, or ideas for new features. I hope it helps make troubleshooting and impact analysis in SAP Integration Suite a little easier for the community.</P><P><STRONG>Happy integrating!</STRONG></P> 2026-07-20T12:12:08.365000+02:00