Oracle ERP Cloud Integration Security Roles: Minimum Privilege Design

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

TL;DR

System Profile

Oracle Fusion Cloud ERP uses a layered RBAC (Role-Based Access Control) model where security is enforced through job roles, duty roles, and privileges organized in a strict hierarchy. Integration security applies across all modules -- Financials, Procurement, Supply Chain Management, HCM, and Project Management. This card covers Release 24A through 25D. On-premise Oracle E-Business Suite uses a fundamentally different security model and is not covered here.

PropertyValue
VendorOracle
SystemOracle Fusion Cloud ERP (Release 25A-25D)
API SurfaceREST, SOAP, FBDI, BIP
Current API VersionRelease 25D (quarterly updates)
Editions CoveredEnterprise (cloud-only)
DeploymentCloud
API DocsOracle ERP Cloud Security Guide
StatusGA

API Surfaces & Capabilities

Oracle ERP Cloud exposes multiple integration surfaces, each requiring different security role configurations. The security model applies consistently across all surfaces, but the specific duty roles and privileges differ.

API SurfaceProtocolBest ForSecurity RequirementAuth MethodReal-time?Bulk?
REST APIHTTPS/JSONIndividual record CRUD, lookupsAPI-specific duty roles + data securityOAuth 2.0 / JWTYesNo
SOAP Web ServicesHTTPS/XMLComplex operations, legacy integrationsService-specific privileges + data rolesSAML / WS-SecurityYesNo
FBDI (File-Based Data Import)UCM + ESSBulk data loads (AP invoices, journals)Module duty roles + ESS privilegesBasic Auth / OAuthNoYes
BI Publisher (BIP)HTTPS/XMLReport extracts, data exportsBI role + report-specific accessBasic Auth / OAuthNoYes
Business EventsOracle Integration CloudEvent-driven callbacksEvent subscription privilegesToken-basedYesN/A
ADF/Web ServicesHTTPS/XML-SOAPUI-level service operationsFull module job rolesSAMLYesNo

Rate Limits & Quotas

Per-Request Limits

Limit TypeValueApplies ToNotes
REST API payload size5 MBREST API requestsSplit larger payloads into multiple requests
FBDI file size250 MB per fileFile uploads to UCMUse multiple files for larger data sets
SOAP message size25 MBSOAP web service callsConfigurable via admin but default is 25 MB
REST query results500 records defaultREST GET operationsUse offset/limit for pagination
BIP report output300 MBBI Publisher report generationLarge reports must be scheduled

Rolling / Daily Limits

Limit TypeValueWindowNotes
REST API callsNo published hard limitN/AFair-use throttling applies; Oracle monitors abnormal usage
ESS job submissions50 concurrent jobsPer podFBDI imports count toward ESS job limits
UCM file uploads1,000 per hourPer userApplies to FBDI data file staging
Business Event subscriptions50 per integrationPer OIC instanceEach subscription requires its own role configuration

Authentication

FlowUse WhenToken LifetimeRefresh?Notes
OAuth 2.0 (JWT Assertion)Server-to-server REST integrationsConfigurable (default 1h)New JWT per requestRecommended for production integrations
SAML AssertionSOAP web service callsSession-basedNoRequires Identity Provider federation
Basic Auth (Username/Password)Development, testing, FBDI uploadsSession timeoutNoMust be over HTTPS; not recommended for production REST
OAuth 2.0 (Authorization Code)User-context REST operations1h access tokenYes (refresh token)For integrations acting on behalf of a specific user

Authentication Gotchas

Constraints

Integration Pattern Decision Tree

START -- Design security roles for Oracle ERP Cloud integration
|-- What integration surface?
|   |-- REST API
|   |   |-- Identify each REST endpoint your integration calls
|   |   |-- Map endpoints to API-specific duty roles (see Quick Reference)
|   |   |-- Create custom job role -> nest required API duty roles
|   |   |-- Assign data security policies for each business unit/ledger
|   |   +-- Authentication: OAuth 2.0 JWT assertion (recommended)
|   |-- SOAP Web Services
|   |   |-- Identify WSDL services required
|   |   |-- Map to service operation privileges
|   |   |-- Create custom job role -> nest service duty roles
|   |   +-- Authentication: SAML assertion
|   |-- FBDI (File-Based Data Import)
|   |   |-- Identify import templates needed
|   |   |-- Assign module-specific import duty roles
|   |   |-- Add ESS scheduling privilege
|   |   |-- Add UCM content access privileges
|   |   +-- Authentication: Basic auth (upload) + ESS job scheduling
|   +-- BI Publisher (BIP) Extracts
|       |-- Identify reports needed
|       |-- Assign BI Consumer or BI Author role
|       +-- Authentication: Basic auth or OAuth
|-- How many modules?
|   |-- Single module -> one custom integration job role
|   |-- Multiple modules -> evaluate SoD risk first
|   |   |-- Option A: one integration user per module (safest)
|   |   +-- Option B: one integration user, multi-module role (faster, riskier)
+-- What data scope?
    |-- Single business unit -> restrict data role to that BU
    |-- Multiple business units -> create data role per BU
    +-- All business units -> use "Grant on all values" (audit carefully)

Quick Reference

Key Predefined Integration Roles by Module

ModulePredefined RoleRole CodeWhat It GrantsIntegration Surface
Financials (GL)Financial Integration SpecialistORA_GL_FINANCIAL_INTEGRATION_SPECIALISTJournal import, GL inquiry, period operationsFBDI, REST, SOAP
Financials (AP)Accounts Payable Integration SpecialistORA_AP_ACCOUNTS_PAYABLE_INTEGRATION_SPECIALISTInvoice import, payment processingFBDI, REST
Financials (AR)Receivables Integration SpecialistORA_AR_RECEIVABLES_INTEGRATION_SPECIALISTReceipt processing, customer importFBDI, REST
Financials (FA)Asset Integration SpecialistORA_FA_ASSET_INTEGRATION_SPECIALISTAsset mass additions, transfersFBDI
ProcurementProcurement Integration SpecialistORA_PO_PROCUREMENT_INTEGRATION_SPECIALISTPO import, supplier managementFBDI, REST
SCM (Inventory)Inventory Integration SpecialistORA_INV_INVENTORY_INTEGRATION_SPECIALISTItem import, on-hand transactionsFBDI, REST
SCM (Order Mgmt)Order Management Integration SpecialistORA_OM_ORDER_MANAGEMENT_INTEGRATION_SPECIALISTSales order import, fulfillmentFBDI, REST
HCMIntegration SpecialistORA_HCM_INTEGRATION_SPECIALISTWorker data import, absence managementFBDI, REST, HDL
ProjectsProject Integration SpecialistORA_PA_PROJECT_INTEGRATION_SPECIALISTProject/task import, cost transactionsFBDI, REST

Duty Roles Commonly Needed for REST API Access

API Endpoint CategoryRequired Duty RolePrivilege ExampleNotes
GL JournalsGeneral Accounting DutyCreate Journal, Import JournalMust pair with ledger data security
AP InvoicesAccounts Payable Invoice DutyCreate AP Invoice, View AP InvoiceMust pair with BU data security
AR ReceiptsReceivables Transaction DutyCreate AR Receipt, Apply AR ReceiptMust pair with BU data security
SuppliersSupplier Maintenance DutyCreate Supplier, Update SupplierMust pair with procurement BU data security
Purchase OrdersPurchasing Transaction DutyCreate Purchase Order, View Purchase OrderMust pair with BU and requisitioning BU
Items/InventoryItem Management DutyCreate Item, Update ItemMust pair with inventory organization data security
Employees/WorkersWorker Management DutyView Worker, Create PersonHCM-specific data roles required

Step-by-Step Integration Guide

1. Create a Dedicated Integration User

Create a separate user account exclusively for the integration. Never reuse a human user account. [src7]

Navigation: Setup and Maintenance > Manage Users
1. Click "Add User" or use SCIM REST API
2. Set User Name: INT_<SYSTEM>_<MODULE> (e.g., INT_OIC_FINANCIALS)
3. Set a strong password (if using basic auth) or leave password-less for OAuth-only
4. Do NOT assign any seeded job roles at this stage

Verify: Navigate to Security Console > Users > search for the new user -> user should exist with zero roles assigned.

2. Design a Custom Integration Job Role

Create a minimal custom job role that nests only the required duty roles. [src2, src4]

Navigation: Tools > Security Console > Roles > Create Role
1. Role Name: Custom <Module> Integration Role
2. Role Code: CUSTOM_INT_GL (your naming convention)
3. Role Category: Common
4. Click "Duty Roles" tab > Add Duty Role
5. Search and add ONLY the duty roles your integration needs
6. Click "Function Security Policies" tab
7. Verify only necessary privileges are inherited
8. REMOVE any unnecessary privileges (UI navigation, approvals)

Verify: Security Console > Roles > search your custom role > "Privilege" tab -> verify no unnecessary privileges exist.

3. Configure Data Security Policies

Data security defines WHICH data the integration can access. Without this, the integration user calls APIs but gets empty results. [src1, src6]

Navigation: Security Console > Roles > [Your Custom Role] > Data Security Policies
1. Click "Create Data Security Policy"
2. Database Resource: select the business object (e.g., "Ledger", "Business Unit")
3. Dataset: select the condition
   - "Select by instance set" -> specific ledger(s) or BU(s)
   - "Grant on all values" -> all records (use sparingly)
4. Actions: select only needed actions (Read, Manage)
5. Repeat for each business object the integration touches

Verify: Sign in as the integration user -> call the REST API -> confirm response contains only expected records.

4. Assign the Custom Role to the Integration User

Assign only the custom role -- no seeded job roles. [src2]

Navigation: Security Console > Users > [Integration User] > Roles > Add Role
1. Search for your custom role (e.g., "Custom GL Integration Role")
2. Click "Add Role Membership"
3. Set Provisioning Status to "Provisioned"
4. Click Save

Verify: Security Console > Users > [Integration User] > "Roles and Role Memberships" tab -> confirm only your custom integration role appears.

5. Configure FBDI-Specific Privileges (If Using File Import)

FBDI requires additional privileges beyond module-level duty roles. [src3]

Add these duty roles to your custom integration job role:
1. "Manage File Import and Export" (for UCM file staging)
2. "Run <Module> Scheduled Processes" (for ESS job submission)
3. "Import <Object>" privilege specific to your import template
Add UCM content security for relevant content folders.

Verify: Sign in as the integration user -> navigate to Scheduled Processes -> confirm only relevant import jobs are visible.

6. Validate and Test the Configuration

Test all API endpoints the integration will use with the actual integration user credentials. [src7]

# Test REST API access with the integration user
curl -X GET \
  "https://<instance>.fa.ocs.oraclecloud.com/fscmRestApi/resources/latest/journals" \
  -H "Authorization: Bearer <access_token>" \
  -H "Content-Type: application/json"
# Expected: 200 OK with journal data for assigned ledgers only
# 403 = missing function security; 200 with empty items[] = missing data security

Verify: Response contains data ONLY for the assigned ledgers/business units.

Code Examples

Python: Audit Integration User Privileges via REST API

# Input:  Oracle ERP Cloud instance URL, OAuth access token
# Output: List of all roles and privileges assigned to integration user

import requests

base_url = "https://<instance>.fa.ocs.oraclecloud.com"
token = "<oauth_access_token>"
username = "INT_OIC_FINANCIALS"

headers = {
    "Authorization": f"Bearer {token}",
    "Content-Type": "application/json"
}

resp = requests.get(
    f"{base_url}/hcmRestApi/resources/latest/userAccounts",
    params={"q": f"Username={username}", "expand": "roles"},
    headers=headers
)

if resp.status_code == 200:
    user_data = resp.json()
    for item in user_data.get("items", []):
        print(f"User: {item.get('Username')}")
        for role in item.get("roles", []):
            print(f"  Role: {role.get('RoleName')} ({role.get('RoleCode')})")
else:
    print(f"Error: {resp.status_code} - {resp.text}")

cURL: Test Integration User REST API Access Per Module

# Input:  Instance URL, integration username, password
# Output: HTTP status codes per module endpoint

# Test GL access
curl -s -o /dev/null -w "%{http_code}" \
  -u "INT_OIC_FINANCIALS:<password>" \
  "https://<instance>.fa.ocs.oraclecloud.com/fscmRestApi/resources/latest/journals?limit=1"

# Test AP access
curl -s -o /dev/null -w "%{http_code}" \
  -u "INT_OIC_FINANCIALS:<password>" \
  "https://<instance>.fa.ocs.oraclecloud.com/fscmRestApi/resources/latest/invoices?limit=1"

# Verify data scope: count accessible ledgers
curl -s -u "INT_OIC_FINANCIALS:<password>" \
  "https://<instance>.fa.ocs.oraclecloud.com/fscmRestApi/resources/latest/ledgers" \
  | python -c "import sys,json; d=json.load(sys.stdin); print(f'Accessible ledgers: {d.get(\"count\",0)}')"

Data Mapping

Security Object Hierarchy

Security LayerOracle TermPurposeExampleAssignable To Users?
Job RoleJob RoleTop-level role representing a job functionFinancial Integration SpecialistYes
Abstract RoleAbstract RoleCross-functional role (Employee, Contingent Worker)EmployeeYes
Duty RoleDuty RoleLogical group of related privilegesGeneral Accounting DutyNo (nest in job role)
Function PrivilegeFunction Security PrivilegeAtomic permission to perform an actionCreate Journal EntryNo (nest in duty role)
Data Security PolicyData Security PolicyGrant to access specific data rowsAccess Ledger: Vision OperationsNo (attach to duty/job role)
Data RoleData RoleJob role + data security combinedUS Financials Integration Data RoleYes

Data Type Gotchas

Error Handling & Failure Points

Common Error Codes

CodeMeaningCauseResolution
403 ForbiddenFunction security violationIntegration user lacks the API-specific duty role or privilegeAdd the required duty role via Security Console
200 with empty items[]Data security violation (silent)User has function access but no data security for the target data setAdd data security policy for the specific ledger/BU/org
401 UnauthorizedAuthentication failureInvalid credentials, expired token, or user lockedVerify credentials; check if user is active; regenerate token
500 Internal Server ErrorPrivilege conflictRole configuration creates circular references or missing dependenciesReview role hierarchy in Security Console
JBO-26061Data security policy violationAttempted operation on data outside granted scopeExpand data security policy to include missing BU or ledger
FND-0062Privilege not foundReferenced privilege code does not exist in current releaseCheck privilege code against current release documentation

Failure Points in Production

Anti-Patterns

Wrong: Assigning Seeded Job Roles Directly to Integration Users

# WRONG -- assigning broad seeded roles
Security Console > Users > INT_OIC_ALL > Add Role
  Role: "General Accountant"        # 200+ privileges, includes approvals
  Role: "Accounts Payable Manager"  # includes payment approvals and UI nav
  Role: "Procurement Manager"       # includes sourcing and negotiation

Correct: Creating Minimal Custom Integration Roles

# CORRECT -- custom role with only needed duty roles
Security Console > Roles > Create Role
  Role Name: "Custom Financials Integration Role"
  Duty Roles:
    - "General Accounting Duty"        # journal operations only
    - "Accounts Payable Invoice Duty"  # invoice CRUD only, no approvals
    - "Run Financials Scheduled Processes"  # ESS for FBDI
  Data Security:
    - Ledger: "US Primary Ledger" only
    - Business Unit: "US Business Unit" only

Wrong: Using "Grant on All Values" for Data Security

# WRONG -- granting access to ALL business units/ledgers
Data Security Policy:
  Database Resource: Business Unit
  Condition: "Grant on all values"  # sees ALL BUs globally

Correct: Restricting Data Security to Specific Business Units

# CORRECT -- granting access only to required business units
Data Security Policy:
  Database Resource: Business Unit
  Condition: "Select by instance set"
  Business Units: ["US Business Unit", "UK Business Unit"]

Wrong: Sharing a Human User Account for Integrations

# WRONG -- using a named user for integration
Integration Connection:
  Username: "john.smith"     # human user
  # breaks audit trail, SoD conflict, breaks when John leaves

Correct: Using Dedicated Integration Service Accounts

# CORRECT -- dedicated service account
Integration Connection:
  Username: "INT_OIC_GL"           # dedicated, non-human user
  Auth: OAuth 2.0 JWT assertion    # no password to rotate
  Roles: "Custom GL Integration Role" only

Common Pitfalls

Diagnostic Commands

# List all roles assigned to integration user
curl -s -u "admin_user:<password>" \
  "https://<instance>.fa.ocs.oraclecloud.com/hcmRestApi/resources/latest/userAccounts?q=Username=INT_OIC_FINANCIALS&expand=roles" \
  | python -m json.tool

# Test function security: attempt GL journal query
curl -s -w "\nHTTP Status: %{http_code}\n" \
  -u "INT_OIC_FINANCIALS:<password>" \
  "https://<instance>.fa.ocs.oraclecloud.com/fscmRestApi/resources/latest/journals?limit=1"

# Test data security: count accessible ledgers
curl -s -u "INT_OIC_FINANCIALS:<password>" \
  "https://<instance>.fa.ocs.oraclecloud.com/fscmRestApi/resources/latest/ledgers" \
  | python -c "import sys,json; d=json.load(sys.stdin); print(f'Accessible ledgers: {d.get(\"count\",0)}')"

# Check ESS scheduling privilege (for FBDI)
curl -s -w "\nHTTP Status: %{http_code}\n" \
  -u "INT_OIC_FINANCIALS:<password>" \
  "https://<instance>.fa.ocs.oraclecloud.com/fscmRestApi/resources/latest/erpintegrations"

# Verify data scope: list accessible business units
curl -s -u "INT_OIC_FINANCIALS:<password>" \
  "https://<instance>.fa.ocs.oraclecloud.com/fscmRestApi/resources/latest/businessUnits" \
  | python -c "import sys,json; d=json.load(sys.stdin); [print(i['BusinessUnitName']) for i in d.get('items',[])]"

Version History & Compatibility

ReleaseDateStatusSecurity ChangesMigration Notes
25D2025-11CurrentEnhanced REST API data security enforcementVerify all REST integrations post-upgrade
25C2025-08SupportedNew duty roles for Project Management REST APIsAdd new duty roles if using PPM REST
25B2025-05SupportedSecurity Console UI refresh; role comparison toolNo breaking changes
25A2025-02SupportedNone significant--
24D2024-11SupportedData security enforcement tightened for REST APIsREST integrations may return empty results
24C2024-08SupportedNew data security requirement for Procurement RESTAdd procurement data security policies
24B2024-05EOLNone significantMinimum version for current REST features

When to Use / When Not to Use

Use WhenDon't Use WhenUse Instead
Setting up a new integration with Oracle ERP CloudConfiguring Oracle IDCS federationOracle IDCS documentation
Designing minimum-privilege roles for service accountsManaging end-user (human) role assignmentsOracle HCM Security Implementation Guide
Troubleshooting 403 errors or empty API responsesDebugging OIC adapter configurationOIC adapter documentation
Auditing integration user privileges before go-liveImplementing SoD rulesSoD analysis tools (Pathlock, SafePaaS)
Migrating integration roles between environmentsSetting up OCI IAM policiesOCI IAM documentation

Important Caveats

Related Units