Summary
The integration solution is designed to solve a coordination and rate limit management problem between Ariba Event Management API and Keelvar APIs .
During the implementation of Interfaces (see below) that require orchestration of the APIs between the two systems, it was discovered that strictly imposed rate limits in Ariba Event Management APIs mainly, but also Keelvar Intake and Export APIs, are reached, causing Integrations to fail.
To address this, an Integration Orchestration Solution is introduced using available tools in SAP CPI. The major aspects of the solution are:
- Use of a single JMS Queue shared by all Interfaces utilising the mentioned APIs
- Use of singleton processing via a Router IFlow that sequentially and synchronously processes messages in the JMS Queue
- Use of Connectors to Ariba and Keelvar APIs that are rate-limit aware and automatically pause if limits are reached.
Overall, this solution provides a robust, controlled, and extensible foundation for managing multiple API-based integrations between Ariba and Keelvar, ensuring operational stability and compliance with API usage policies in Ariba and Keelvar. And furthermore, this solution can be extended if and when further Integrations need to be implemented that utilise Ariba and Keelvar APIs, in addition to the 3 interfaces that currently ( as of 24-October-2025 ) utilise this:
| ID | Description |
|---|
| ERP-108 | Synchronisation of Sourcing Events created and updated in Ariba to Keelvar |
| ERP-137 | Synchronisation of Award Bids and Bid Sheets from Keelvar to Ariba |
| ERP-138 | Notification of Keelvar Event Status changes to Ariba |
Description
Ariba Event Management API contains both intake and export endpoints supporting Ariba Strategic Sourcing Platform to read, create and update Sourcing events, Scenarios and Awards. The Event Management API requests are rate-limit controlled as shown below:
| Time limits | Number of Requests |
|---|
| Per second | 5 |
| Per minute | 80 |
| Per Hour | 3500 |
Keelvar Intake and Export APIs are two different sets of API Services with separated rate-limits:
- Intake APIs: Enables Sourcing Event read, creation and update in Keelvar. In addition, APIs also contains services to check the Event Processing background job status.
| API | Burst | Sustained |
|---|
| Sourcing Events | 120 per hour | 500 per day |
| Process Job Status | 30 per minute | 600 per hour |
- Export APIs: Enables reading of Sourcing Events, Bids and Awards.
| API | Burst | Sustained |
|---|
| Awards | 60 per minute | 43,200 per day |
| Bids | 60 per minute | 43,200 per day |
| Events | 60 per minute | 43,200 per day |
To manage this constraint, this framework enables the orchestration of the APIs between the two systems, avoiding and recovering from rate-limiting exceptions as well as handling exceptions such as data errors, service unavailability etc.
The following guiding principles need to be applied in the IFlows pertaining to the Integration:
- All requests to APIs from IFlows will be via Request-Reply objects - this enables the ability to handle Exceptions by logging the response message bodies, return codes etc
- The Processing will be broken up in to small Asynchronous sequential calls. This allows the integration to re-process only failed API calls and then, once successful, hand over to the next IFlow seamlessly
- The IFlows will be designed in such a way to reduce the number of API calls, ideally to contain only one API call for each system. Multiple APIs will orchestrate when strictly necessary, since this increases the chances of reaching the rate limit during processing of subsequent messages from the JMS Queue.
- The IFlows will be designed so that re-processing via the JMS Queue will not effect the outcome expected.
- The IFlows will only use the Ariba and Keelvar Connector IFlows to access the APIs. This ensures that the API calls are sequential and each is completed before the next occurs
- The IFlows will handle and log the exceptions and raise a new exception to push it back to JMS Queue. This ensures that the Error notification is captured in CPI.
- The Sequence of the IFlows are via Process Direct direct endpoints to allow the Router to identify the Processing IFlow once it is pushed into JMS Queue
Solution Overview
Process Flow
eyJleHRTcnZJbnRlZ1R5cGUiOiIiLCJnQ2xpZW50SWQiOiIiLCJjcmVhdG9yTmFtZSI6IkVQQVNJTkdIRS1leHQsIEthcGlsYSIsIm91dHB1dFR5cGUiOiJibG9jayIsImxhc3RNb2RpZmllck5hbWUiOiJFUEFTSU5HSEUtZXh0LCBLYXBpbGEiLCJsYW5ndWFnZSI6ImVuIiwidWlDb25maWciOiJ7fSIsImRpYWdyYW1EaXNwbGF5TmFtZSI6IiIsInNGaWxlSWQiOiIiLCJhdHRJZCI6Ijk1MjcyNTQ1NCIsImRpYWdyYW1OYW1lIjoiSk1TLU92ZXJ2aWV3IiwiYXNwZWN0IjoiIiwibGlua3MiOiJhdXRvIiwiY2VvTmFtZSI6Ik5GUi0yMDA3IEFyaWJhIEV2ZW50IE1hbmFnZW1lbnQgT3JjaGVzdHJhdGlvbiBGcmFtZXdvcmsiLCJ0YnN0eWxlIjoidG9wIiwiY2FuQ29tbWVudCI6ZmFsc2UsImRpYWdyYW1VcmwiOiIiLCJjc3ZGaWxlVXJsIjoiIiwiYm9yZGVyIjp0cnVlLCJtYXhTY2FsZSI6IjEiLCJvd25pbmdQYWdlSWQiOjk0NTA1OTA3NiwiZWRpdGFibGUiOmZhbHNlLCJjZW9JZCI6OTUyNzI2OTc2LCJwYWdlSWQiOiIiLCJsYm94Ijp0cnVlLCJzZXJ2ZXJDb25maWciOnsiZW1haWxwcmV2aWV3IjoiMSJ9LCJvZHJpdmVJZCI6IiIsInJldmlzaW9uIjoyLCJtYWNyb0lkIjoiNTdhM2E2YmYtOWI5Mi00Y2ViLTkzOGItN2MxMmNhZGQ2NDRkIiwicHJldmlld05hbWUiOiJKTVMtT3ZlcnZpZXcucG5nIiwibGljZW5zZVN0YXR1cyI6Ik9LIiwic2VydmljZSI6IiIsImlzVGVtcGxhdGUiOiIiLCJ3aWR0aCI6IjkyMiIsInNpbXBsZVZpZXdlciI6ZmFsc2UsImxhc3RNb2RpZmllZCI6MTc3NTcxOTgyNDY2NCwiZXhjZWVkUGFnZVdpZHRoIjpmYWxzZSwib0NsaWVudElkIjoiIn0=
| Step | Function |
|---|
| 1 | Invoker IFlow initiates the processing. Ideally, this IFlow will not contain any calls to Ariba or Keelvar APIs. |
| 2 | After defining the parameters (headers) necessary for processing at Provider IFlow, including the ProcessDirect Path of the Provider IFlow, the message is passed to the JMS Queue |
| 3 | The Router, reads the message from the JMS Queue and routes the message directly to the ProcessDirect Path of the Provider IFlow, defined in the message |
| 4 | The Provider IFlow will execute any API calls to Ariba and Keelvar. If needed The Provider IFlow can invoke further JMS Entries |
Key Components of the JMS Solution
| Component | Description |
|---|
| JMS Queue | Central JMS Queue |
| Router IFlow | The singleton IFlow that directly reads from the JMS Queue. This is single threaded, controlled via standard JMS Sender Configuration. |
| Ariba Event Management API Connector | Handles all API requets to Ariba Event Management API. Errors are logged but also returned to the calling IFlow. |
| Keelvar API Connector | Handles all API requests to Keelvar Intake and Export APIs. Errors are logged but also returned to the calling IFlow |
Technical Details
Invoker IFlow Configuration Requirements
| Object | Value | Description |
|---|
| Header Value | jmsProcessDirectPath | The ProcessDirect path of the Provider IFlow |
| Queue Name in JMS Receiver Adapter Configuration | aribaEventMgtQueue | Name of the JMS Queue. Externalisable value |
JMS Queue
All IFlows that forwards the processing to JMS Queue should have the following configuration settings in the JMS Receiver Adapter
| Object | Value | Description |
|---|
| Queue Name | aribaEventMgtQueue | The Unique name for the JMS Queue |
| Access Type | Non-Excluseive | Each JMS Queue entry will process independent of each other due to the Design Principles applied |
| Retention Threshold for Alerting | 2 days |
|
| Expiration Period | 30 days |
|
JMS Events Router
Sender Adapter JMS Configuration
| Object | Value | Description |
|---|
| Queue Name in JMS Sender Adapter Configuriton | aribaEventMgtQueue | Name of the JMS Queue. Externalisable value |
| Number of Concurrent Processes | 1 | Note: This value is important for Singleton Instant of the IFlow. This is vital for Serialised processing of the Queue |
| Retry Interval | 1 minute |
|
| Exponential Backoff | Ticked |
|
| Maximum Retry Interval | 60 minutes |
|
| Dead Letter Queue | Ticked |
|
| 5 |
|
Receiver Adapter JMS Configuration - For Dead Letter Queue
| Object | Value | Description |
|---|
| Queue Name | DLQ_aribaEventMgtQueue | All messages after the configured number of Retries are moved to this DLQ |
| Access Type | Non-Exclusive | Since messages are not automatically reprocessed from this queue, this value is not relevant for the solution |
| Retention Threshold for Alerting | 2 days |
|
| Expiration Period | 30 days |
|
| Compress Stored Messages | Ticked |
|
| Encrypt Stored Messages | Not ticked |
|
| Transfer Exchange Properties | Ticked |
|
Other Configurations
| Object | Value | Description |
|---|
| maximumRetries | 5 | After the defined number of attempts, the message is pushed to JMS Queue. The Failed messages can be found in the Monitoring |
Provider IFlows Configuration Requirements
- Provider IFlows Sender ProcessDirector Adapter path must be defined as the header parameter jmsProcessDirectPath defined in the Invoker IFlow.
- Header and Property definitions required for Ariba and Keelvar APIs must be defined as described below in the Ariba Event Management API Connector IFlow and Keelvar API Connector IFlow
- If the Provider IFlow injects any messages tot he JMSQueue, then the parameters defined in the Invoker IFlow must also be defined
Ariba Event Management API Connector IFlow
The Ariba Connector constructs the URL and the Authentication Parameters based on valued passed from the calling IFlow and configurable parameters in the Connector. The construct is shown below:
Ariba URL
Construction of the URL with an example:
| METHOD | https:// | <Ariba Base URL> | <Ariba URL Path> | ? | <Connector Defined Query Parameters> | & | <Received Query Parameters> |
|---|
| GET | https:// | eu.openapi.ariba.com/api/sourcing-events/v2/prod | /events/identifiers | ? | realm=7452####-SS-T&user=R_XXXXXXXX&passwordAdapater=XXXXXXXXX | & | $filter=(createDateFrom gt 1761418273 and createDateTo=1761464729) |
Any IFlow calling the Adapter must provide the following Header Parameters to construct the API endpoint to Ariba
| Object | Header Name | Description |
|---|
| HTTP Method | aribaMethod | The HTTP Method for the API |
| Ariba Url Path | aribaUrlPath | The Path (i.e. the endpoint) that is amalgamated with the Base URL to construct the API endpoint |
| Query Parameters | aribaUrlQuery | The additional Query Parameters that must be amalgamated with the the Common Query parameters defined in the Adapter |
Additional Parameters
| Object | Value | Description |
|---|
| Queue Name in JMS Sender Adapter Configuriton | aribaEventMgtQueue | Name of the JMS Queue. Externalisable value |
| Number of Concurrent Processes | 1 | Note: This value is important for Singleton Instant of the IFlow. This is vital for Serialised processing of the Queue |
| Retry Interval | 1 minute |
|
| Exponential Backoff | Ticked |
|
| Maximum Retry Interval | 60 minutes |
|
| Dead Letter Queue | Ticked |
|
| 5 |
|
Keelvar API Connector IFlow
Similarly, the Keelvar Connector constructs the URL based on the values passed from the calling IFlow and configurable parameters in the Connector.
| METHOD | https:// | <Keelvar Base URL> | <Keelvar URL Path> | ? | <Query Parameters> |
|---|
| GET | https:// | test.keelvar.dev/api | /feeds/awards | ? | sourcing_event=$event_uuid' |
Error Handling & Retry Strategy
| Scenario | Action |
|---|
| Temporary API Failure (HTTP 429/503) | Pause and retry after wait time. |
| Permanent API Error (HTTP 400/401/404) | Log to MPL and move to DLQ. |
| JMS Retry Exhausted | Message flagged as ignored; alert triggered. |
| Rate-Limit Exceeded | Connector pauses until limit resets. |
Monitoring & Observability
| Tool | Usage |
|---|
| CPI Message Monitoring | Track message status, errors, and retries. |
| JMS Queue Monitor | Check pending, in-flight, and DLQ messages. |
| MPL Logs | Track API call results and pause events. |
Future Enhancements
- Use API Header driven pause
- DLQ
Change Log