Oracle ERP Cloud Business Events — Subscription Model, Event Catalog, and Webhook Delivery

Type: ERP Integration System: Oracle Fusion Cloud ERP (Release 26A) Confidence: 0.87 Sources: 7 Verified: 2026-03-09 Freshness: 2026-03-09

TL;DR

System Profile

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.

PropertyValue
VendorOracle
SystemOracle Fusion Cloud ERP (Release 24A-26A)
API SurfaceBusiness Events via EHF + REST management API
Current Release26A (quarterly updates)
Editions CoveredEnterprise (single cloud edition)
DeploymentCloud (SaaS only)
API DocsOracle ERP Cloud Adapter Docs
StatusGA — actively expanded each quarterly release

API Surfaces & Capabilities

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 SurfaceProtocolBest ForDelivery ModelRate LimitReal-time?Bulk?
Business Events (EHF)SOAP/internal push to OICEvent-driven outbound notificationsPush to subscriber endpointNo explicit limit (throughput-based)YesNo
Event Catalog RESTHTTPS/JSONDiscovering available eventsRequest/responseStandard Fusion REST limitsN/AN/A
Event Subscription RESTHTTPS/JSONManaging subscriptions programmaticallyRequest/responseStandard Fusion REST limitsN/AN/A
ERP Business Events REST APIHTTPS/JSONEnabling/disabling eventsRequest/responseStandard Fusion REST limitsN/AN/A
FBDI Callback EventsSOAP/internal push to OICBulk import completion notificationsPush (ErpImportBulkDataEvent)N/ASemi (post-job)Yes

Rate Limits & Quotas

Per-Event Delivery Limits

Limit TypeValueApplies ToNotes
Max automatic retries10Per event deliveryAfter 10 retries, event enters "maxed out" state requiring manual retry [src2]
Backlog redelivery window6 hoursDeactivated integrationsEvents resend only if integration reactivated within 6 hours [src3]
Event payload sizeSummary onlyAll business eventsPayload contains key identifiers — use REST API for full record details
Concurrent event subscriptionsNo hard limit publishedPer OIC instancePractical limit depends on OIC edition

Event Processing Limits

Limit TypeValueWindowNotes
Fusion REST API callsFair-use throttlingPer-tenantNo published hard daily cap; Oracle throttles based on tenant activity
OIC message throughputEdition-dependentPer-minuteStandard: 5K msg/hr, Enterprise: 25K msg/hr (OIC limits, not ERP limits)
Event catalog queryStandard RESTPer-requestAccessed via /soa-infra/PublicEvent/catalog

Authentication

FlowUse WhenToken LifetimeRefresh?Notes
Username-Password TokenEvent trigger connections (recommended)Session-scoped, auto-managedAutoEHF generates time-sensitive session tokens [src1]
OAuth JWT User AssertionInvoke connections, server-to-serverConfigurable, trust via key pairNew JWT per requestNo client secret required [src1]
OAuth Authorization CodeUser-context invoke operationsAccess: 2h, Refresh: configurableYesNot recommended for event triggers

Authentication Gotchas

Constraints

Integration Pattern Decision Tree

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

Quick Reference — Available Business Events by Module

ModuleEvent NameDefault StateKey Payload Fields
ProcurementPurchase Order EventEnabledPO Header ID, PO Number, Supplier, Business Unit
ProcurementSupplier Created/UpdatedDisabledSupplier ID, Supplier Name, Status
PayablesPayables Invoice CreatedDisabledInvoice ID, Invoice Number, Amount, Supplier
PayablesPayables Invoice ApprovedDisabledInvoice ID, Approval Status
PayablesPayables Invoice ValidatedDisabledInvoice ID, Validation Status
PayablesPayables Payment Created/VoidedDisabledPayment ID, Amount, Method
ReceivablesInvoice Completed/PaidVariesTransaction ID, Amount, Customer
ReceivablesStandard Receipt Created/AppliedVariesReceipt ID, Amount, Customer
General LedgerAccounting Period Opened/ClosedEnabledPeriod Name, Ledger, Status
General LedgerJournal Batch Approved/PostedEnabledBatch ID, Batch Name
ExpensesExpense Report Submitted/Approved/PaidVariesReport ID, Employee, Amount
InventoryAdvanced Shipment Notice EventEnabledASN ID, Shipment Header
Order MgmtSales Order Status UpdatedEnabledOrder ID, Status, Customer
ManufacturingWork Order Create/UpdateEnabledWO ID, Status, Quantity, Operations
PLMChange Order Events (Approval/Completion)EnabledChange ID, Status, Type
PLMItem Create/Update EventsEnabledItem ID, Organization, Revision
PPMProject Status ChangeVariesProject ID, New Status
FBDIERP Integration Inbound (bulk import callback)EnabledJob ID, Status, Document Name

Step-by-Step Integration Guide

1. Discover Available Events via the Event Catalog

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.

2. Enable Disabled Events

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.

3. Configure OIC ERP Cloud Adapter Connection

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.

4. Create Event Subscription Integration

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."

5. Apply Event Filter Expressions (Optional)

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.

6. Monitor Event Delivery

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.

Code Examples

Python: Querying the Event Catalog

# 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)}")

Python: Managing Event Subscriptions

# 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}")

cURL: Event Subscription Inspection

# 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

Data Mapping

Event Payload Structure

Payload ElementExample (PO Event)TypeNotes
Event namespacehttp://xmlns.oracle.com/apps/prc/po/...URIUnique per event type
Header IDPurchaseOrderHeaderId: 300000012345678LongPrimary key for REST API follow-up
Document NumberOrderNumber: PO-12345StringHuman-readable identifier
Business UnitProcurementBU: US1 Business UnitStringFilterable via XPath
StatusStatus: APPROVEDStringLifecycle stage at event time
SupplierSupplier: Acme CorpStringSummary field, not full record

Data Type Gotchas

Error Handling & Failure Points

Common Error Scenarios

ScenarioSymptomCauseResolution
Events not arrivingIntegration active but no eventsEvent disabled in FusionEnable via REST API or profile option
Authentication failureEvent delivery fails with auth errorOAuth used for trigger connectionSwitch to Username-Password Token
Events not in wizardEvents not appearing in adapter configStale metadata cacheRefresh metadata via connection settings
Cross-environment leakTest events arriving in productionStale subscription from env refreshDelete incorrect subscription via REST API
Maxed out retriesEvents stuck at "maxed out" statusDownstream outageFix root cause, manually retry from OIC
Lost events after reactivationMissed events after >6 hour deactivationExceeded 6-hour backlog windowReconcile via REST API query
Empty event catalogCatalog URL returns empty or errorOAM misconfigurationVerify OAM configuration on Fusion instance

Failure Points in Production

Anti-Patterns

Wrong: Polling REST API for changes instead of using business events

# 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)

Correct: Subscribe to Purchase Order Event via OIC

# 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

Wrong: Storing full business object data from event payload

# 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

Correct: Using event as trigger, then fetching full record via REST

# 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

Wrong: Deleting event subscription during planned maintenance

# BAD — deleting subscription loses all queued events
def maintenance_mode():
    deactivate_integration(delete_subscription=True)
    # All events during maintenance are PERMANENTLY LOST

Correct: Keeping subscription active during maintenance

# 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

Common Pitfalls

Diagnostic Commands

# 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

Version History & Compatibility

ReleaseDateStatusKey ChangesNotes
26A2026-01CurrentAdditional PLM events, enhanced monitoringLatest quarterly update
25D2025-10SupportedExpanded PPM events-
25C2025-07SupportedOCI Events integration previewEvent bridge to OCI Events service
25A (25.02)2025-01SupportedMTOM attachment format defaultBreaking if you relied on BASE64 inline
24D2024-10SupportedEnhanced event diagnostics UI in OICImproved observability page
24B2024-04SupportedCustom business event supportCreate 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.

When to Use / When Not to Use

Use WhenDon't Use WhenUse Instead
Real-time outbound notification when ERP transactions occurNeed to write data INTO Oracle ERP CloudOracle Fusion REST API or FBDI import
Event-driven architecture with OIC or compatible iPaaSNeed bulk data extraction (thousands of records)BIP reports via REST API or FBDI export
Downstream systems must react immediately to ERP state changesNeed direct HTTP webhook to custom endpoint (no iPaaS)OCI Events service with custom event publishing
Reducing API polling overhead and latencyNeed bidirectional sync without iPaaSREST API polling with CDC pattern
Automating post-processing workflowsNeed to subscribe from on-premise via private endpointConnectivity agent + REST API

Cross-System Comparison

CapabilityOracle ERP Cloud (EHF)SAP S/4HANA (Event Mesh)Salesforce (Platform Events)NetSuite (User Event Scripts)
Delivery modelPush via OIC adapterPush via SAP Event Mesh / BTPPush via CometD streamingScript-based (SuiteScript)
Direct webhook supportNo (OIC required)Yes (via Event Mesh)No (CometD subscriber)No (script-triggered)
Event catalog accessREST endpointSAP API Business HubMetadata APIScript deployment
Filter expressionsXPath on payloadSAP Event Mesh rulesSOQL-based subscriptionScript logic
Retry mechanism10 auto-retries + manualConfigurable in Event Mesh24h replay windowImmediate (synchronous)
Custom eventsYes (Application Composer)Yes (RAP events)Yes (Custom Platform Events)Yes (custom scripts)
Disabled-by-default eventsMany (esp. Financials)SomeNo (all available)N/A (script-based)
iPaaS requirementYes (OIC strongly recommended)Yes (BTP recommended)No (direct API access)No (built-in)

Important Caveats

Related Units