ORA_AP_ENABLE_BUSINESS_EVENTS = Y) before they fire.Oracle Fusion Cloud ERP provides a native event-driven integration capability through its Event Handling Framework (EHF). This framework propagates business events beyond the application boundary to external subscribers, primarily through Oracle Integration Cloud (OIC) using the Oracle ERP Cloud Adapter. The events system covers ERP, SCM, Manufacturing, and Project Portfolio Management modules. On-premise Oracle E-Business Suite does NOT use this event framework.
| Property | Value |
|---|---|
| Vendor | Oracle |
| System | Oracle Fusion Cloud ERP (Release 24A-26A) |
| API Surface | Business Events via EHF + REST management API |
| Current Release | 26A (quarterly updates) |
| Editions Covered | Enterprise (single cloud edition) |
| Deployment | Cloud (SaaS only) |
| API Docs | Oracle ERP Cloud Adapter Docs |
| Status | GA — actively expanded each quarterly release |
Oracle ERP Cloud does not expose business events as raw HTTP webhooks. The Event Handling Framework (EHF) manages event propagation through a pub/sub architecture where OIC or compatible middleware acts as the subscriber.
| API Surface | Protocol | Best For | Delivery Model | Rate Limit | Real-time? | Bulk? |
|---|---|---|---|---|---|---|
| Business Events (EHF) | SOAP/internal push to OIC | Event-driven outbound notifications | Push to subscriber endpoint | No explicit limit (throughput-based) | Yes | No |
| Event Catalog REST | HTTPS/JSON | Discovering available events | Request/response | Standard Fusion REST limits | N/A | N/A |
| Event Subscription REST | HTTPS/JSON | Managing subscriptions programmatically | Request/response | Standard Fusion REST limits | N/A | N/A |
| ERP Business Events REST API | HTTPS/JSON | Enabling/disabling events | Request/response | Standard Fusion REST limits | N/A | N/A |
| FBDI Callback Events | SOAP/internal push to OIC | Bulk import completion notifications | Push (ErpImportBulkDataEvent) | N/A | Semi (post-job) | Yes |
| Limit Type | Value | Applies To | Notes |
|---|---|---|---|
| Max automatic retries | 10 | Per event delivery | After 10 retries, event enters "maxed out" state requiring manual retry [src2] |
| Backlog redelivery window | 6 hours | Deactivated integrations | Events resend only if integration reactivated within 6 hours [src3] |
| Event payload size | Summary only | All business events | Payload contains key identifiers — use REST API for full record details |
| Concurrent event subscriptions | No hard limit published | Per OIC instance | Practical limit depends on OIC edition |
| Limit Type | Value | Window | Notes |
|---|---|---|---|
| Fusion REST API calls | Fair-use throttling | Per-tenant | No published hard daily cap; Oracle throttles based on tenant activity |
| OIC message throughput | Edition-dependent | Per-minute | Standard: 5K msg/hr, Enterprise: 25K msg/hr (OIC limits, not ERP limits) |
| Event catalog query | Standard REST | Per-request | Accessed via /soa-infra/PublicEvent/catalog |
| Flow | Use When | Token Lifetime | Refresh? | Notes |
|---|---|---|---|---|
| Username-Password Token | Event trigger connections (recommended) | Session-scoped, auto-managed | Auto | EHF generates time-sensitive session tokens [src1] |
| OAuth JWT User Assertion | Invoke connections, server-to-server | Configurable, trust via key pair | New JWT per request | No client secret required [src1] |
| OAuth Authorization Code | User-context invoke operations | Access: 2h, Refresh: configurable | Yes | Not recommended for event triggers |
ServiceAdministrator role in OIC to access event monitoring on the Fusion Applications observability page. [src2]START — Need to receive Oracle ERP Cloud events in external system
|
+-- Do you have Oracle Integration Cloud (OIC)?
| +-- YES -> Configure ERP Cloud Adapter trigger connection
| | Select business events from Event Catalog
| | Apply XPath filter expressions (optional)
| | Activate integration -> subscription auto-created
| +-- NO -> Compatible iPaaS (Workato, MuleSoft, Celigo)?
| +-- YES -> Use vendor's Oracle Fusion adapter
| +-- NO -> Custom: query Event Catalog REST, manage subscriptions via REST API
| (NOT recommended - significant maintenance burden)
|
+-- Which events do you need?
| +-- Financial (AP, AR, GL, Payments) -> Check if enabled (many disabled by default)
| +-- Procurement (PO, Supplier) -> PO Event enabled by default
| +-- SCM/Manufacturing (Inventory, WO, OM) -> Most enabled by default
| +-- Bulk import completion (FBDI callback) -> Use ErpImportBulkDataEvent
|
+-- Need event filtering?
| +-- YES -> Apply XPath filter on event payload
| +-- NO -> Subscribe to all instances of the event
|
+-- Error tolerance?
+-- Zero-loss -> Monitor via OIC observability, alert on maxed retries
+-- Best-effort -> Standard 10-retry mechanism usually sufficient
| Module | Event Name | Default State | Key Payload Fields |
|---|---|---|---|
| Procurement | Purchase Order Event | Enabled | PO Header ID, PO Number, Supplier, Business Unit |
| Procurement | Supplier Created/Updated | Disabled | Supplier ID, Supplier Name, Status |
| Payables | Payables Invoice Created | Disabled | Invoice ID, Invoice Number, Amount, Supplier |
| Payables | Payables Invoice Approved | Disabled | Invoice ID, Approval Status |
| Payables | Payables Invoice Validated | Disabled | Invoice ID, Validation Status |
| Payables | Payables Payment Created/Voided | Disabled | Payment ID, Amount, Method |
| Receivables | Invoice Completed/Paid | Varies | Transaction ID, Amount, Customer |
| Receivables | Standard Receipt Created/Applied | Varies | Receipt ID, Amount, Customer |
| General Ledger | Accounting Period Opened/Closed | Enabled | Period Name, Ledger, Status |
| General Ledger | Journal Batch Approved/Posted | Enabled | Batch ID, Batch Name |
| Expenses | Expense Report Submitted/Approved/Paid | Varies | Report ID, Employee, Amount |
| Inventory | Advanced Shipment Notice Event | Enabled | ASN ID, Shipment Header |
| Order Mgmt | Sales Order Status Updated | Enabled | Order ID, Status, Customer |
| Manufacturing | Work Order Create/Update | Enabled | WO ID, Status, Quantity, Operations |
| PLM | Change Order Events (Approval/Completion) | Enabled | Change ID, Status, Type |
| PLM | Item Create/Update Events | Enabled | Item ID, Organization, Revision |
| PPM | Project Status Change | Varies | Project ID, New Status |
| FBDI | ERP Integration Inbound (bulk import callback) | Enabled | Job ID, Status, Document Name |
Query the public event catalog REST endpoint to see all available business events for your Fusion instance. [src3]
# Query event catalog
curl -u "integration_user:password" \
"https://YOUR_FUSION_HOST.oraclecloud.com/soa-infra/PublicEvent/catalog"
# Query custom events only
curl -u "integration_user:password" \
"https://YOUR_FUSION_HOST.oraclecloud.com/soa-infra/PublicEvent/customCatalog"
Verify: Response returns JSON array with event names and namespace URIs.
Many events (especially Payables) are disabled by default. Enable via profile option or REST API. [src6]
# Enable Payables events via profile option:
# Navigate: Setup and Maintenance > Manage Administrator Profile Values
# Search: ORA_AP_ENABLE_BUSINESS_EVENTS > Set to Y
# Or enable via REST API:
curl -X PATCH -u "admin_user:password" \
-H "Content-Type: application/json" \
"https://YOUR_FUSION_HOST.oraclecloud.com/fscmRestApi/resources/latest/erpBusinessEvents/{eventName}" \
-d '{"EnabledFlag": "Y"}'
Verify: Enabled events appear in the OIC adapter's event selection wizard.
Create a trigger connection in OIC using the ERP Cloud Adapter with Username-Password Token security. [src1]
OIC Console:
1. Integrations > Connections > Create
2. Select "Oracle ERP Cloud" adapter
3. Configure: ERP Cloud Host URL, Username Password Token security
4. Test Connection -> verify "100% Configured"
5. Save
Verify: Connection shows green "Configured" status.
Build an App Driven Orchestration integration that subscribes to the desired business event. [src4]
OIC Console:
1. Create Integration > App Driven Orchestration
2. Add Trigger: drag ERP Cloud Adapter connection
3. Select "Receive Business Events raised within ERP Cloud"
4. Choose event (e.g., "Purchase Order Event")
5. Optionally add XPath Filter Expression
6. Map event payload to target system
7. Activate Integration -> subscription auto-created
Verify: Check OIC Observability > Fusion Applications — subscription should appear as "Active."
Filter events using XPath expressions on the event payload. [src4]
<!-- Filter PO events by item description -->
<xpathExpr
xmlns:ns0="http://xmlns.oracle.com/apps/prc/po/editDocument/purchaseOrderServiceV2/"
xmlns:ns2="http://xmlns.oracle.com/apps/prc/po/editDocument/purchaseOrderServiceV2/types/">
$eventPayload/ns2:result/ns0:Value/ns0:PurchaseOrderLine/ns0:ItemDescription="Lan Cable"
</xpathExpr>
Verify: Create test POs matching and not matching the filter — only matching events trigger the integration.
Use the OIC Fusion Applications observability page to track delivery status. [src2]
OIC Console > Observability > Fusion Applications
Event delivery statuses:
- Queued: waiting to be delivered
- Delivered: successfully sent to OIC
- Retried: delivery reattempted (up to 10 times)
- Maxed out retries: failed after 10 attempts (manual retry required)
Verify: Create a test transaction — event should appear with "Delivered" status within seconds.
# Input: Oracle Fusion Cloud credentials and host URL
# Output: List of available business events
import requests
from requests.auth import HTTPBasicAuth
FUSION_HOST = "https://your-instance.oraclecloud.com"
USERNAME = "integration_user"
PASSWORD = "your_password"
def get_event_catalog():
url = f"{FUSION_HOST}/soa-infra/PublicEvent/catalog"
resp = requests.get(url, auth=HTTPBasicAuth(USERNAME, PASSWORD), timeout=30)
resp.raise_for_status()
events = resp.json()
for event in events:
print(f"Event: {event.get('name', 'N/A')}")
return events
catalog = get_event_catalog()
print(f"Total events available: {len(catalog)}")
# Input: Oracle Fusion Cloud credentials
# Output: List of active event subscriptions
import requests
from requests.auth import HTTPBasicAuth
FUSION_HOST = "https://your-instance.oraclecloud.com"
def list_subscriptions():
url = f"{FUSION_HOST}/soa-infra/PublicEvent/subscriptions"
resp = requests.get(url, auth=HTTPBasicAuth("admin", "pass"), timeout=30)
resp.raise_for_status()
return resp.json()
def delete_subscription(subscription_id):
url = f"{FUSION_HOST}/soa-infra/PublicEvent/subscriptions/{subscription_id}"
resp = requests.delete(url, auth=HTTPBasicAuth("admin", "pass"), timeout=30)
resp.raise_for_status()
print(f"Deleted subscription: {subscription_id}")
# List all subscriptions
curl -u "admin_user:password" \
"https://YOUR_FUSION_HOST.oraclecloud.com/soa-infra/PublicEvent/subscriptions"
# Delete a stale subscription
curl -X DELETE -u "admin_user:password" \
"https://YOUR_FUSION_HOST.oraclecloud.com/soa-infra/PublicEvent/subscriptions/{id}"
# Check event catalog
curl -u "integration_user:password" \
"https://YOUR_FUSION_HOST.oraclecloud.com/soa-infra/PublicEvent/catalog" \
| python3 -m json.tool
| Payload Element | Example (PO Event) | Type | Notes |
|---|---|---|---|
| Event namespace | http://xmlns.oracle.com/apps/prc/po/... | URI | Unique per event type |
| Header ID | PurchaseOrderHeaderId: 300000012345678 | Long | Primary key for REST API follow-up |
| Document Number | OrderNumber: PO-12345 | String | Human-readable identifier |
| Business Unit | ProcurementBU: US1 Business Unit | String | Filterable via XPath |
| Status | Status: APPROVED | String | Lifecycle stage at event time |
| Supplier | Supplier: Acme Corp | String | Summary field, not full record |
YYYY-MM-DDTHH:MM:SS.sssZ). Convert explicitly for local-time downstream systems. [src1]documentName field in FBDI callback events identifies the import job type — use this to route callbacks to different processing logic. [src1]| Scenario | Symptom | Cause | Resolution |
|---|---|---|---|
| Events not arriving | Integration active but no events | Event disabled in Fusion | Enable via REST API or profile option |
| Authentication failure | Event delivery fails with auth error | OAuth used for trigger connection | Switch to Username-Password Token |
| Events not in wizard | Events not appearing in adapter config | Stale metadata cache | Refresh metadata via connection settings |
| Cross-environment leak | Test events arriving in production | Stale subscription from env refresh | Delete incorrect subscription via REST API |
| Maxed out retries | Events stuck at "maxed out" status | Downstream outage | Fix root cause, manually retry from OIC |
| Lost events after reactivation | Missed events after >6 hour deactivation | Exceeded 6-hour backlog window | Reconcile via REST API query |
| Empty event catalog | Catalog URL returns empty or error | OAM misconfiguration | Verify OAM configuration on Fusion instance |
Never delete subscription during maintenance. Reactivate within 6 hours. [src3]Set ORA_AP_ENABLE_BUSINESS_EVENTS = Y. [src3]After every refresh, list and delete stale subscriptions via /soa-infra/PublicEvent/subscriptions. [src3]Copy exact namespace URIs from event catalog. Test with permissive filter first. [src4]# BAD — polling Fusion REST API every 5 minutes for new POs
# Wastes API quota, adds latency, misses rapid changes
import time
while True:
response = requests.get(
f"{FUSION_HOST}/fscmRestApi/resources/latest/purchaseOrders"
f"?q=CreationDate > '{last_check}'", auth=auth)
process_new_pos(response.json())
time.sleep(300)
# GOOD — event-driven, near-real-time, no wasted API calls
# 1. ERP Cloud Adapter trigger -> "Purchase Order Event"
# 2. Event fires immediately when PO is approved
# 3. Integration calls REST API for full details
# 4. Forward to downstream system
# Result: <1s latency, zero polling overhead
# BAD — assuming event payload contains complete record
def process_po_event(event_payload):
po_data = extract_from_payload(event_payload)
insert_to_warehouse(po_data) # Missing most fields
# GOOD — event triggers, REST API fetches full data
def process_po_event(event_payload):
po_header_id = extract_header_id(event_payload)
full_po = requests.get(
f"{FUSION_HOST}/fscmRestApi/resources/latest/"
f"purchaseOrders/{po_header_id}?expand=lines", auth=auth).json()
insert_to_warehouse(full_po) # Complete record
# BAD — deleting subscription loses all queued events
def maintenance_mode():
deactivate_integration(delete_subscription=True)
# All events during maintenance are PERMANENTLY LOST
# GOOD — keep subscription, events queue for redelivery (up to 6 hours)
def maintenance_mode():
deactivate_integration(delete_subscription=False)
# Complete maintenance within 6 hours
reactivate_integration()
# Backlogged events are automatically redelivered
Query /soa-infra/PublicEvent/catalog and cross-reference with ERP Business Events REST API. [src3]Use Username-Password Token for all trigger connections. Reserve OAuth for invoke. [src3]After every refresh, GET /soa-infra/PublicEvent/subscriptions and DELETE stale entries. [src3]Design for <6 hour maintenance windows. Implement reconciliation job for longer outages. [src3]Set up monitoring alerts. Check for "maxed out retries" status daily. [src2]Budget for OIC or compatible iPaaS as part of the integration architecture. [src1]# Check event catalog (all standard events)
curl -u "integration_user:password" \
"https://YOUR_FUSION_HOST.oraclecloud.com/soa-infra/PublicEvent/catalog" \
| python3 -m json.tool | head -50
# Check custom events catalog
curl -u "integration_user:password" \
"https://YOUR_FUSION_HOST.oraclecloud.com/soa-infra/PublicEvent/customCatalog"
# List active event subscriptions
curl -u "admin_user:password" \
"https://YOUR_FUSION_HOST.oraclecloud.com/soa-infra/PublicEvent/subscriptions"
# Delete a specific stale subscription
curl -X DELETE -u "admin_user:password" \
"https://YOUR_FUSION_HOST.oraclecloud.com/soa-infra/PublicEvent/subscriptions/{ID}"
# Monitor event delivery in OIC Console:
# Navigate: Observability > Fusion Applications
# Filter by: connection name, time range, status
| Release | Date | Status | Key Changes | Notes |
|---|---|---|---|---|
| 26A | 2026-01 | Current | Additional PLM events, enhanced monitoring | Latest quarterly update |
| 25D | 2025-10 | Supported | Expanded PPM events | - |
| 25C | 2025-07 | Supported | OCI Events integration preview | Event bridge to OCI Events service |
| 25A (25.02) | 2025-01 | Supported | MTOM attachment format default | Breaking if you relied on BASE64 inline |
| 24D | 2024-10 | Supported | Enhanced event diagnostics UI in OIC | Improved observability page |
| 24B | 2024-04 | Supported | Custom business event support | Create events in Application Composer |
Oracle Fusion Cloud follows a quarterly release cadence (A/B/C/D per year). Business event APIs are backward-compatible within major releases. New events are added each quarter. The Event Handling Framework is the strategic direction with no sunset planned.
| Use When | Don't Use When | Use Instead |
|---|---|---|
| Real-time outbound notification when ERP transactions occur | Need to write data INTO Oracle ERP Cloud | Oracle Fusion REST API or FBDI import |
| Event-driven architecture with OIC or compatible iPaaS | Need bulk data extraction (thousands of records) | BIP reports via REST API or FBDI export |
| Downstream systems must react immediately to ERP state changes | Need direct HTTP webhook to custom endpoint (no iPaaS) | OCI Events service with custom event publishing |
| Reducing API polling overhead and latency | Need bidirectional sync without iPaaS | REST API polling with CDC pattern |
| Automating post-processing workflows | Need to subscribe from on-premise via private endpoint | Connectivity agent + REST API |
| Capability | Oracle ERP Cloud (EHF) | SAP S/4HANA (Event Mesh) | Salesforce (Platform Events) | NetSuite (User Event Scripts) |
|---|---|---|---|---|
| Delivery model | Push via OIC adapter | Push via SAP Event Mesh / BTP | Push via CometD streaming | Script-based (SuiteScript) |
| Direct webhook support | No (OIC required) | Yes (via Event Mesh) | No (CometD subscriber) | No (script-triggered) |
| Event catalog access | REST endpoint | SAP API Business Hub | Metadata API | Script deployment |
| Filter expressions | XPath on payload | SAP Event Mesh rules | SOQL-based subscription | Script logic |
| Retry mechanism | 10 auto-retries + manual | Configurable in Event Mesh | 24h replay window | Immediate (synchronous) |
| Custom events | Yes (Application Composer) | Yes (RAP events) | Yes (Custom Platform Events) | Yes (custom scripts) |
| Disabled-by-default events | Many (esp. Financials) | Some | No (all available) | N/A (script-based) |
| iPaaS requirement | Yes (OIC strongly recommended) | Yes (BTP recommended) | No (direct API access) | No (built-in) |
/soa-infra/PublicEvent/catalog for the definitive list./soa-infra/PublicEvent/customCatalog, not the standard catalog endpoint.