Oracle ERP Cloud Data Security Policies: API Impact for Integration Users

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

TL;DR

System Profile

This card covers Oracle Fusion Cloud ERP (Releases 25A through 25D, covering 2025-2026) and how its data security framework affects REST API responses for integration users. The data security model applies uniformly across all Oracle Fusion Cloud ERP modules including Financials (GL, AP, AR, FA), Procurement, Project Portfolio Management, and Supply Chain Management. This card does NOT cover Oracle HCM Cloud security profiles, Oracle Integration Cloud adapter-level security, or OCI IAM policies.

PropertyValue
VendorOracle
SystemOracle Fusion Cloud ERP (Release 25A-25D)
API SurfaceREST (fscmRestApi)
Current API Version11.13.18.05 (Release 25A)
Editions CoveredAll editions (data security is consistent across editions)
DeploymentCloud
API DocsOracle Financials REST API
StatusGA

API Surfaces & Capabilities

Oracle ERP Cloud exposes multiple API surfaces. Data security policies apply to all of them -- REST, SOAP, FBDI file imports, and BIP report extracts all respect the same underlying data security grants.

API SurfaceProtocolBest ForData Security Enforced?Security MechanismNotes
REST (fscmRestApi)HTTPS/JSONIndividual CRUD, queries, real-timeYesDB-layer WHERE clauses via ADF securityPrimary integration surface
SOAP (composite services)HTTPS/XMLLegacy integrationsYesSame OPSS/data security frameworkBeing phased out
FBDI (File-Based Data Import)CSV via UCMBulk imports, data migrationPartiallyValidates on write; user needs target BU accessBypasses read-side filtering
BIP ReportsHTTPS/XML-CSVBulk data extracts, scheduled reportingYesReport data security parametersLedger/BU parameters required
Business EventsREST/webhookEvent-driven, outbound notificationsYesEvents fire only for data the user can accessPayload scope matches user scope

Rate Limits & Quotas

Per-Request Limits

Limit TypeValueApplies ToNotes
Default page size25 recordsREST API collection responsesConfigurable via limit parameter
Max page size500 recordsREST API collection responsesUse offset for pagination beyond 500
Max request body size50 MBREST API POST/PATCHSplit larger payloads
FBDI file size250 MBFile-Based Data ImportSplit across multiple files for larger loads

Rolling / Daily Limits

Limit TypeValueWindowNotes
REST API callsNo published per-day capN/AOracle uses fair-use throttling
FBDI import jobsNo published capN/AThrottled by ESS queue depth
BIP report executionsConfigurable by adminPer-tenantDefault concurrent limit configurable
Concurrent long-running requestsManaged by ESSPer-tenantESS work manager thread pool limits

Data Security Processing Overhead

Security DimensionPerformance ImpactMitigation
Business unit grants (< 5 BUs)NegligibleStandard configuration
Business unit grants (> 20 BUs)Noticeable query slowdownUse "All Values" grant where audit allows
Cross-module security joinsModerate (ledger + BU + legal entity)Pre-build data roles with combined grants
Custom policies with complex SQLSignificantAvoid subqueries; use indexed columns

Authentication

Data security is independent of authentication method. All three supported auth flows respect the same data security policies.

FlowUse WhenToken LifetimeRefresh?Notes
Basic Auth over SSLTesting, simple integrationsSession-based (default 8h)NoEasiest to set up
SAML 2.0 Bearer TokenEnterprise SSO, federated identityConfigurable (1-2h)Yes (via IdP)Requires SAML IdP configuration
JWT TokenServer-to-server, modern integrationsConfigurable (1-2h)New JWT per requestRecommended for production
OAuth 2.0 (via OCI IAM)Cloud-native integrationsAccess: 1hYesRequires OCI IAM domain federation

Authentication Gotchas

Constraints

Integration Pattern Decision Tree

START -- Integration user gets empty/incomplete data from Oracle ERP Cloud REST API
|
+-- Is authentication succeeding? (HTTP 200 returned?)
|   +-- NO (401/403) --> Fix authentication credentials; NOT a data security issue
|   +-- YES (200 with empty or partial results) --> Data security filtering is the cause
|       |
|       +-- Check 1: Does the integration user have a DATA ROLE (not just a job role)?
|       |   +-- NO --> Create a data role that inherits the job role + security profile
|       |   +-- YES --> Continue
|       |
|       +-- Check 2: Correct security context assignments?
|       |   +-- For Financials (AP/AR): BU assigned? Ledger via Data Access Set? Legal Entity?
|       |   +-- For Procurement: Procurement BU? Requisitioning BU?
|       |   +-- For Inventory/SCM: Inventory Organization? Manufacturing Plant?
|       |   +-- NO --> Add missing security context values
|       |   +-- YES --> Continue
|       |
|       +-- Check 3: Session refreshed after grant changes?
|       |   +-- NO --> Force new session (re-authenticate)
|       |   +-- YES --> Continue
|       |
|       +-- Check 4: Custom data security policies with restrictive conditions?
|       |   +-- YES --> Review instance set SQL WHERE clauses in Security Console
|       |   +-- NO --> Check module-specific feature opt-in requirements
|       |
|       +-- Check 5: Data visible in UI when logged in as integration user?
|           +-- NO --> Data security configuration issue (fix in Security Console)
|           +-- YES --> REST API-specific privilege requirements (check API duty roles)

Quick Reference

Data Security Components and Their Relationships

ComponentDefinitionScopeAPI Impact
PrivilegeSingle action on a business objectPer-object/actionDetermines which CRUD operations succeed
Duty RoleBundle of related privilegesPer-moduleMust include REST API-specific duty roles
Job RoleBusiness role with multiple duty rolesCross-moduleGrants functional access but NOT data access alone
Data RoleJob role + security profileData-scopedControls which records API responses include
Security ProfileDefines which data a role can seePer-dimensionWHERE-clause generator for DB queries
Data Access SetGL-specific: which ledgers a user can accessGL moduleRequired separately from BU access for GL API calls
Security ContextCategory of securable values (BU, Ledger, etc.)Per-moduleEach context is an independent filter dimension
Instance SetSQL condition defining which records matchPer-grantDirectly translates to API response filtering
GrantAuthorization linking role + privilege + instance setPer-user/roleThe actual enforcement mechanism

Security Context Dimensions by Module

ModuleSecurity ContextTypical GrantAPI Resource Affected
General LedgerData Access Set (Ledger)Specific ledgers or "All Ledgers"/journals, /accountingPeriods
Accounts PayableBusiness UnitSpecific BUs or "All BUs"/invoices, /payments, /suppliers
Accounts ReceivableBusiness UnitSpecific BUs or "All BUs"/receivablesInvoices, /receipts
Fixed AssetsAsset BookSpecific books/assets, /assetBooks
ProcurementProcurement BU + Requisitioning BUSpecific BUs/purchaseOrders, /requisitions
InventoryInventory OrganizationSpecific orgs/inventoryItems, /inventoryTransactions
ProjectProject OrganizationSpecific orgs/projects, /projectTasks

Step-by-Step Integration Guide

1. Verify integration user's current security assignments

Query the data securities REST endpoint to see what access the integration user currently has. [src7]

curl -u "INTEGRATION_USER:password" \
  -X GET "https://your-instance.fa.us2.oraclecloud.com/fscmRestApi/resources/11.13.18.05/dataSecurities?q=UserName=INTEGRATION_USER" \
  -H "Content-Type: application/vnd.oracle.adf.resourcecollection+json"

Verify: Response items array contains entries for each required security context. If empty, the user has no data access grants.

2. Assign the correct job role with API duty roles

Navigate to Security Console and assign the job role that includes the necessary REST API duty roles. [src2]

Navigation: Setup and Maintenance > Security Console > Users
1. Search for integration user
2. Click "Edit" > "Roles" tab
3. Add required job role (e.g., "Accounts Payable Manager")
4. Verify the job role includes REST API duty roles

Verify: In Security Console > Roles > search for the job role > "Privilege" tab, confirm REST-related privileges are present.

3. Create or assign a data role with security profile

The data role pairs the job role with a security profile to scope data visibility. [src1, src5]

Navigation: Setup and Maintenance > Manage Data Access for Users
1. Search for the integration user
2. Click "Add Data Access"
3. Select the role (e.g., "Accounts Payable Manager")
4. Select the security context (e.g., "Business Unit")
5. Select the value(s) (e.g., "US Operations BU", "EU Operations BU")
6. Save

Verify: curl the invoices endpoint and confirm records from the assigned BU appear.

4. Assign Data Access Sets for General Ledger

GL access requires separate Data Access Set assignment -- BU grants do not cascade to ledger access. [src1]

Navigation: Setup and Maintenance > Manage Data Access Set Assignments
1. Search for integration user
2. Add data access set (e.g., "US Primary Ledger Access Set")
3. Set access privileges: Read-Only or Read/Write
4. Save

Verify: Query the journals endpoint -- records from the assigned ledger should appear.

5. Force session refresh and validate

Data security changes require a fresh session. Re-authenticate after making grant changes. [src4]

curl -u "INTEGRATION_USER:password" \
  -X GET "https://your-instance.fa.us2.oraclecloud.com/fscmRestApi/resources/11.13.18.05/invoices?limit=5&fields=InvoiceId,InvoiceNumber,BusinessUnit" \
  -H "Content-Type: application/vnd.oracle.adf.resourcecollection+json" \
  -H "Cache-Control: no-cache"

Verify: Response items array contains records with BusinessUnit values matching your assigned BUs.

Code Examples

Python: Diagnose data security grants for an integration user

# Input:  Oracle Fusion Cloud base URL, integration user credentials
# Output: Dictionary of security context assignments per module

import requests
from requests.auth import HTTPBasicAuth

FUSION_BASE = "https://your-instance.fa.us2.oraclecloud.com"
API_PATH = "/fscmRestApi/resources/11.13.18.05"
USERNAME = "INTEGRATION_USER"
PASSWORD = "secure_password"

def get_data_security_assignments(username):
    url = f"{FUSION_BASE}{API_PATH}/dataSecurities"
    params = {"q": f"UserName={username}", "limit": "500"}
    headers = {"Content-Type": "application/vnd.oracle.adf.resourcecollection+json"}
    resp = requests.get(url, params=params,
        auth=HTTPBasicAuth(USERNAME, PASSWORD),
        headers=headers, timeout=30)
    resp.raise_for_status()
    return resp.json().get("items", [])

def diagnose_missing_data(username):
    assignments = get_data_security_assignments(username)
    contexts = {}
    for a in assignments:
        ctx = a.get("SecurityContext", "Unknown")
        if ctx not in contexts:
            contexts[ctx] = []
        contexts[ctx].append(a.get("SecurityContextValue", "N/A"))
    required = ["BusinessUnit", "Ledger", "LegalEntity"]
    for r in required:
        if r not in contexts:
            print(f"WARNING: No {r} assignment found for {username}")
        else:
            print(f"OK: {r} -> {contexts[r]}")
    return contexts

cURL: Quick test for data visibility per module

# Input:  Valid credentials for the integration user
# Output: Record counts per module to verify data security grants

FUSION_BASE="https://your-instance.fa.us2.oraclecloud.com"
API="$FUSION_BASE/fscmRestApi/resources/11.13.18.05"
AUTH="INTEGRATION_USER:password"

echo "=== AP Invoices ==="
curl -s -u "$AUTH" "$API/invoices?limit=1&totalResults=true" \
  -H "Content-Type: application/vnd.oracle.adf.resourcecollection+json" \
  | python3 -c "import sys,json; d=json.load(sys.stdin); print(f'Total: {d.get(\"totalResults\",\"N/A\")}')"

echo "=== GL Journals ==="
curl -s -u "$AUTH" "$API/journals?limit=1&totalResults=true" \
  -H "Content-Type: application/vnd.oracle.adf.resourcecollection+json" \
  | python3 -c "import sys,json; d=json.load(sys.stdin); print(f'Total: {d.get(\"totalResults\",\"N/A\")}')"

# If any module returns Total: 0, the integration user
# is missing data security grants for that module

Data Mapping

Security Context to API Resource Mapping

Security ContextGrant TypeAPI Resources FilteredHow to Check Assignment
Business Unit (AP)Manage Data Access for Users/invoices, /payments, /suppliersGET /dataSecurities?q=SecurityContext=BusinessUnit
Business Unit (AR)Manage Data Access for Users/receivablesInvoices, /receiptsGET /dataSecurities?q=SecurityContext=BusinessUnit
Data Access Set (GL)Manage Data Access Set Assignments/journals, /accountingPeriodsSeparate admin page; not in /dataSecurities
Legal EntityManage Data Access for Users/legalEntities, tax resourcesGET /dataSecurities?q=SecurityContext=LegalEntity
Asset BookManage Data Access for Users/assets, /assetBooksGET /dataSecurities?q=SecurityContext=AssetBook
Inventory OrganizationManage Inventory Org Data Access/inventoryItems, /inventoryTransactionsSeparate admin page for SCM
Procurement BUManage Data Access for Users/purchaseOrders, /requisitionsGET /dataSecurities?q=SecurityContext=ProcurementBU

Data Type Gotchas

Error Handling & Failure Points

Common Error Codes

CodeMeaningCauseResolution
HTTP 200 + empty itemsData security filteringUser has no grants for requested dimensionAdd data role / security context assignment
HTTP 200 + partial resultsPartial data security grantsGrants for some BUs/ledgers but not allAdd missing security context values
HTTP 403Functional privilege deniedUser lacks duty role / privilege for resourceAdd required job role with API duty roles
HTTP 401Authentication failureInvalid credentials or expired sessionRe-authenticate; check password expiry
JBO-27122SQL data security errorCustom policy has invalid SQL in instance setFix instance set WHERE clause in Security Console
APJ-1Application privilege errorUser role missing specific object privilegeAdd missing privilege to duty/job role

Failure Points in Production

Anti-Patterns

Wrong: Granting only a job role and expecting API data access

# WRONG -- job role alone gives functional access but zero data visibility
Setup steps (incorrect):
1. Create integration user
2. Assign job role: "Accounts Payable Manager"
3. Call /invoices API
4. Result: HTTP 200, items: [] (empty -- no error!)

Correct: Grant a data role that combines job role with security profile

# CORRECT -- data role = job role + security profile (data dimension)
Setup steps (correct):
1. Create integration user
2. Assign job role: "Accounts Payable Manager"
3. Navigate to: Manage Data Access for Users
4. Add data access: Role = AP Manager, Context = Business Unit, Value = "US Operations"
5. Call /invoices API
6. Result: HTTP 200, items: [invoices from US Operations BU]

Wrong: Assuming Business Unit access includes Ledger access

# WRONG -- BU and Ledger are independent security dimensions
Steps (incorrect):
1. Assign data access: BU = "US Operations" for AP Manager role
2. Call /journals API (General Ledger)
3. Result: HTTP 200, items: [] (empty -- ledger not granted!)

Correct: Configure each security dimension independently

# CORRECT -- grant BU access AND Data Access Set for GL separately
Steps (correct):
1. Assign data access: BU = "US Operations" for AP Manager role
2. ALSO: Manage Data Access Set Assignments > add "US Primary Ledger" for GL role
3. Call /journals API
4. Result: HTTP 200, items: [journal entries from US Primary Ledger]

Wrong: Using a super-user integration account with all-access grants

# WRONG -- violates least privilege, creates audit risk
Steps (incorrect):
1. Create integration user "INT_SUPER_USER"
2. Grant "All Values" for every security context
3. Use for all integrations regardless of scope

Correct: Create purpose-specific integration users with scoped access

# CORRECT -- each integration has its own user with minimum required access
Steps (correct):
1. Create "INT_AP_US" for US AP integration (AP Manager + BU = "US Operations" only)
2. Create "INT_GL_GLOBAL" for GL consolidation (GL Accountant + All Ledgers)
3. Create "INT_PO_EU" for EU procurement (Buyer + Procurement BU = "EU Procurement")

Common Pitfalls

Diagnostic Commands

# Check integration user's data security assignments
curl -s -u "INT_USER:password" \
  "https://your-instance.fa.us2.oraclecloud.com/fscmRestApi/resources/11.13.18.05/dataSecurities" \
  -H "Content-Type: application/vnd.oracle.adf.resourcecollection+json" \
  | python3 -m json.tool

# Test AP invoice visibility (should return records if BU access granted)
curl -s -u "INT_USER:password" \
  "https://your-instance.fa.us2.oraclecloud.com/fscmRestApi/resources/11.13.18.05/invoices?limit=1&totalResults=true" \
  -H "Content-Type: application/vnd.oracle.adf.resourcecollection+json"

# Test GL journal visibility (requires separate Data Access Set)
curl -s -u "INT_USER:password" \
  "https://your-instance.fa.us2.oraclecloud.com/fscmRestApi/resources/11.13.18.05/journals?limit=1&totalResults=true" \
  -H "Content-Type: application/vnd.oracle.adf.resourcecollection+json"

# Verify which business units the user can see
curl -s -u "INT_USER:password" \
  "https://your-instance.fa.us2.oraclecloud.com/fscmRestApi/resources/11.13.18.05/businessUnits?limit=500&totalResults=true" \
  -H "Content-Type: application/vnd.oracle.adf.resourcecollection+json"

# Describe an API resource to check available fields and privileges
curl -s -u "INT_USER:password" \
  "https://your-instance.fa.us2.oraclecloud.com/fscmRestApi/resources/11.13.18.05/invoices/describe" \
  -H "Content-Type: application/vnd.oracle.adf.resourcecollection+json"

Version History & Compatibility

ReleaseDateStatusData Security ChangesNotes
25D2025-11CurrentEnhanced data sovereignty controlsAI analytics for security audit
25C2025-08SupportedNo breaking changesMinor security UI improvements
25B2025-05SupportedNo breaking changes--
25A2025-02SupportedData securities REST endpoint addedFirst release with programmatic security query
24D2024-11SupportedImproved security context management UI--
24C2024-08SupportedNo breaking changes--

When to Use / When Not to Use

Use WhenDon't Use WhenUse Instead
Integration user returns empty API results despite valid authUser gets HTTP 401/403Standard auth troubleshooting
Need to scope integration data to specific business unitsNeed to control which REST endpoints are accessibleFunctional security (job roles and API duty roles)
Configuring new integration user for cross-module accessSetting up OIC adapter connectionsOIC adapter security configuration
Auditing what data an integration can see vs should seeTroubleshooting API performance unrelated to securityAPI performance tuning

Important Caveats

Related Units