Oracle Fusion Cloud EPM (Enterprise Performance Management) is Oracle's cloud-native planning, budgeting, consolidation, and close platform. It replaces on-premises Oracle Hyperion products (Planning, HFM, FDMEE). EPM Cloud is delivered as a unified platform with multiple business processes: Planning (PBCS/EPBCS), Financial Consolidation and Close (FCCS), Account Reconciliation (ARCS), Tax Reporting (TRCS), Profitability and Cost Management (PCMCS), and Enterprise Data Management (EDMCS). This card covers EPM Cloud integration surfaces, not Oracle ERP Cloud (Fusion Financials) — those are separate products often deployed together.
EPM Cloud uses monthly release cycles (e.g., 25.11 for November 2025) with no version pinning. All tenants are upgraded automatically. Integration code must be tested against preview environments before each monthly update goes live.
| Property | Value |
|---|---|
| Vendor | Oracle |
| System | Oracle Fusion Cloud EPM (25.11+) |
| API Surface | REST API, EPM Automate CLI, Data Integration, SmartView |
| Current API Version | Monthly releases (25.11, 25.12, 26.01, etc.) |
| Editions Covered | Enterprise (single edition for EPM Cloud) |
| Deployment | Cloud (OCI-hosted SaaS) |
| API Docs | REST APIs for Oracle Fusion Cloud EPM |
| Status | GA |
Oracle EPM Cloud provides four distinct integration surfaces, each designed for different use cases and personas.
| API Surface | Protocol | Best For | Max Records/Request | Rate Limit | Real-time? | Bulk? |
|---|---|---|---|---|---|---|
| REST API | HTTPS/JSON | Programmatic automation, CI/CD pipelines | File-based (upload/download) | Concurrent session limit (5-10/env) | Yes | Via file ops |
| EPM Automate | CLI/HTTPS | Admin scripting, scheduled jobs | File-based (snapshot/data files) | Sequential (one cmd at a time) | No | Yes |
| Data Integration | Web UI + REST triggers | ERP-to-EPM data loads with dimension mapping | Millions of intersections per load | Governed by pod resources | No | Yes |
| SmartView | Excel Add-in/HTTPS | Ad hoc analysis, manual data entry | Grid-limited (~50K cells practical) | Per-user session | Yes | No |
| Groovy Business Rules | In-process | Server-side automation, REST callouts from EPM | N/A (server-side) | Execution timeout | Yes | N/A |
| Data Exchange (Pipeline) | REST/Web UI | Multi-step orchestrated integrations | Pipeline-dependent | Pod resources | No | Yes |
Unlike transactional ERPs, EPM Cloud does not publish fixed API call quotas. Instead, it uses concurrency-based throttling tied to pod resource allocation.
| Limit Type | Value | Applies To | Notes |
|---|---|---|---|
| Max concurrent REST sessions | 5-10 (pod-dependent) | REST API | Additional requests queue or return 429 |
| Max file upload size | 2 GB | REST API file upload | Practical limit for data/metadata files |
| Max SmartView grid cells | ~50,000 cells | SmartView ad hoc | Performance degrades beyond this |
| Max Data Integration rows | Millions | Data Integration | Limited by pod memory; chunk for very large datasets |
| Business rule timeout | 3-10 minutes | Groovy/calc scripts | Long-running calcs need async patterns |
| EPM Automate session timeout | 30 minutes (idle) | CLI sessions | Re-login required after idle timeout |
| Limit Type | Value | Window | Edition Differences |
|---|---|---|---|
| Concurrent REST API sessions | 5-10 per environment | Continuous | Based on pod size (Standard, Large, X-Large) |
| Daily maintenance window | 1 hour | Daily (configurable time) | All environments — no API access |
| Monthly update window | 4-8 hours | Monthly | Preview environment updates first |
| Snapshot storage | 5-10 snapshots | Per environment | Older snapshots auto-purged |
EPM Cloud REST APIs support two authentication methods. Oracle strongly recommends OAuth 2.0 for all production integrations.
| Flow | Use When | Token Lifetime | Refresh? | Notes |
|---|---|---|---|---|
| OAuth 2.0 | Production integrations, MFA-enabled environments | Access: 3600s (1h), Refresh: 604,800s (7 days) | Yes | Recommended; required when MFA enforced |
| Basic Auth | Development/testing, non-MFA environments | Session-based (30 min idle timeout) | No | Cannot be used with MFA; deprecated for production |
| OAuth 2.0 via API Gateway | Enterprise environments with APIGEE, IBM DataPower | Same as OAuth 2.0 | Yes | Gateway target URL must exclude context paths |
START - Integrate Oracle EPM Cloud with ERP
|
+-- What's the ERP source system?
| +-- Oracle ERP Cloud (Fusion)?
| | +-- YES -> Data Integration direct connector
| | | +-- Actuals (GL balances) -> GL Direct Integration
| | | +-- Budget write-back -> Budget Journals integration
| | | +-- Sub-ledger detail -> Sub-Ledger Direct Integration
| +-- Oracle NetSuite?
| | +-- YES -> Data Integration direct connector for NetSuite
| +-- Oracle E-Business Suite / PeopleSoft?
| | +-- YES -> Data Integration + EPM Integration Agent (on-prem)
| +-- Non-Oracle ERP (SAP, D365, Workday)?
| +-- File-based integration or OIC middleware
|
+-- What's the automation requirement?
| +-- Fully automated -> EPM Automate + scheduler OR REST API
| +-- Semi-automated -> EPM Automate CLI (interactive)
| +-- Interactive -> SmartView for analysis, Web UI for Data Integration
|
+-- What's the data volume?
+-- < 10K intersections -> Any method works
+-- 10K-1M intersections -> Data Integration or REST API file ops
+-- > 1M intersections -> Data Integration with chunked loads
| Capability | REST API | EPM Automate | Data Integration | SmartView |
|---|---|---|---|---|
| Persona | Developer/integrator | EPM admin | EPM admin/analyst | Finance user |
| Data import | Upload file + run import job | importData command | UI-driven or REST-triggered | Ad hoc submit |
| Data export | Run export job + download file | exportData command | Export to file/ERP | Ad hoc retrieve |
| Metadata mgmt | Import/export metadata files | importMetadata command | Dimension mapping UI | Read-only |
| Business rules | runBusinessRule endpoint | runBusinessRule command | Triggered as post-load step | Manual launch |
| Cube refresh | cubeRefresh endpoint | cubeRefresh command | Automatic post-load | N/A |
| Scheduling | External scheduler required | OS scheduler (cron) | Built-in scheduling | Manual only |
| Error handling | HTTP status + JSON errors | Exit codes + log files | UI error reports + email alerts | Excel error display |
| Dimension mapping | Not built-in (custom code) | Not built-in | Full mapping UI (source->target) | N/A |
| Write-back to ERP | Custom REST calls to ERP | Via integration script | Budget Journals (Oracle ERP only) | N/A |
| Role required | Service Administrator | Service Administrator | Service Admin (config), Power User (run) | Any assigned user |
| MFA compatible | OAuth 2.0 only | OAuth 2.0 token file | Via user session or OAuth | Via SSO |
Obtain an OAuth 2.0 access token from the Oracle Identity Cloud Service (IDCS) or Identity Domain associated with your EPM Cloud instance. [src2]
# Obtain OAuth 2.0 access token from Oracle Identity Domain
curl -X POST \
"https://idcs-<identity-domain>.identity.oraclecloud.com/oauth2/v1/token" \
-H "Content-Type: application/x-www-form-urlencoded" \
-u "<client_id>:<client_secret>" \
-d "grant_type=client_credentials&scope=urn:opc:serviceInstanceID=<epm-instance-id>"
Verify: HTTP 200 with {"access_token":"...","token_type":"Bearer","expires_in":3600}
Upload a CSV data file to the EPM Cloud inbox directory using the REST API. [src1]
# Upload data file to EPM Cloud inbox
curl -X POST \
"https://<epm-url>/interop/rest/11.1.2.3.600/applicationsnapshots/<filename>" \
-H "Authorization: Bearer <access_token>" \
-H "Content-Type: application/octet-stream" \
--data-binary @data_load.csv
Verify: HTTP 200 with {"status":0} — status 0 indicates success.
Trigger the data import job that loads the uploaded file into the Planning or FCCS application. [src1]
# Run import data job
curl -X POST \
"https://<epm-url>/HyperionPlanning/rest/v3/applications/<app_name>/jobs" \
-H "Authorization: Bearer <access_token>" \
-H "Content-Type: application/json" \
-d '{"jobType":"IMPORT_DATA","jobName":"<import_job_name>","parameters":{"importFileName":"<filename>"}}'
Verify: Response includes "jobId" — poll until status is "Completed".
EPM data import and business rule jobs run asynchronously. Poll the job status endpoint until completion. [src1]
# Check job status
curl -X GET \
"https://<epm-url>/HyperionPlanning/rest/v3/applications/<app_name>/jobs/<job_id>" \
-H "Authorization: Bearer <access_token>"
Verify: "status": "Completed" and "statusMessage" shows records loaded.
After data import, trigger business rules (aggregations, allocations, currency conversions) on the new data. [src1, src5]
# Execute a business rule
curl -X POST \
"https://<epm-url>/HyperionPlanning/rest/v3/applications/<app_name>/jobs" \
-H "Authorization: Bearer <access_token>" \
-H "Content-Type: application/json" \
-d '{"jobType":"RULES","jobName":"<rule_name>","parameters":{"runtimePromptValues":"Scenario=Actual,Year=FY2026"}}'
Verify: Poll job status — "status": "Completed" with no errors.
Export processed data from EPM Cloud to the outbox, then download. [src1]
# Run export data job
curl -X POST \
"https://<epm-url>/HyperionPlanning/rest/v3/applications/<app_name>/jobs" \
-H "Authorization: Bearer <access_token>" \
-H "Content-Type: application/json" \
-d '{"jobType":"EXPORT_DATA","jobName":"<export_job_name>"}'
# Download the exported file
curl -X GET \
"https://<epm-url>/interop/rest/11.1.2.3.600/applicationsnapshots/<export_filename>/contents" \
-H "Authorization: Bearer <access_token>" \
-o exported_data.csv
Verify: Downloaded file contains expected dimension members and data values.
# Input: CSV data file, EPM Cloud OAuth credentials
# Output: Successful data load confirmation with record count
import requests
import time
EPM_URL = "https://<epm-host>/HyperionPlanning/rest/v3"
TOKEN_URL = "https://idcs-<domain>.identity.oraclecloud.com/oauth2/v1/token"
def get_token(client_id, client_secret, scope):
resp = requests.post(TOKEN_URL, data={
"grant_type": "client_credentials",
"scope": scope
}, auth=(client_id, client_secret))
resp.raise_for_status()
return resp.json()["access_token"]
def upload_file(token, filename, filepath):
url = f"https://<epm-host>/interop/rest/11.1.2.3.600/applicationsnapshots/{filename}"
with open(filepath, "rb") as f:
resp = requests.post(url, headers={
"Authorization": f"Bearer {token}",
"Content-Type": "application/octet-stream"
}, data=f)
resp.raise_for_status()
return resp.json()
def run_job(token, app, job_type, job_name, params=None):
payload = {"jobType": job_type, "jobName": job_name}
if params:
payload["parameters"] = params
resp = requests.post(f"{EPM_URL}/applications/{app}/jobs",
headers={"Authorization": f"Bearer {token}",
"Content-Type": "application/json"},
json=payload)
resp.raise_for_status()
return resp.json()
def poll_job(token, app, job_id, timeout=600, interval=10):
elapsed = 0
while elapsed < timeout:
resp = requests.get(f"{EPM_URL}/applications/{app}/jobs/{job_id}",
headers={"Authorization": f"Bearer {token}"})
status = resp.json().get("status")
if status == "Completed":
return resp.json()
if status in ("Failed", "Error"):
raise RuntimeError(f"Job failed: {resp.json()}")
time.sleep(interval)
elapsed += interval
raise TimeoutError(f"Job did not complete within {timeout}s")
#!/bin/bash
# Input: EPM Automate installed, OAuth token file, data CSV
# Output: Data loaded into EPM Cloud Planning application
set -euo pipefail
EPM_AUTOMATE="/opt/oracle/epmAutomate/bin/epmautomate.sh"
EPM_URL="https://<epm-host>"
TOKEN_FILE="/secure/epm_oauth_token.txt"
DATA_FILE="/data/daily_actuals.csv"
$EPM_AUTOMATE login "$EPM_URL" "$TOKEN_FILE"
$EPM_AUTOMATE uploadFile "$DATA_FILE"
$EPM_AUTOMATE importData "Vision" "Load_Daily_Actuals" "daily_actuals.csv"
$EPM_AUTOMATE cubeRefresh "Vision" "ASORefreshCube"
$EPM_AUTOMATE runBusinessRule "Vision" "Agg_All_Actuals"
$EPM_AUTOMATE logout
# Input: Valid OAuth 2.0 access token
# Output: List of available applications confirming connectivity
curl -s -X GET \
"https://<epm-host>/HyperionPlanning/rest/v3/applications" \
-H "Authorization: Bearer <access_token>" | python3 -m json.tool
# List files in inbox
curl -s -X GET \
"https://<epm-host>/interop/rest/11.1.2.3.600/applicationsnapshots" \
-H "Authorization: Bearer <access_token>" | python3 -m json.tool
| ERP Source (Oracle ERP Cloud) | EPM Target (Planning/FCCS) | Type | Transform | Gotcha |
|---|---|---|---|---|
| GL Segment 1 (Company) | Entity dimension | String | Direct or lookup table | EPM member names cannot contain spaces |
| GL Segment 2 (Account) | Account dimension | String | Many-to-one rollup via mapping table | Chart of accounts restructuring requires full mapping rebuild |
| GL Segment 3 (Cost Center) | Custom dimension (Department) | String | Prefix/suffix stripping | Ensure EPM custom dimension is mapped in Data Integration |
| GL Period (JAN-26) | Period dimension (Jan) | Date/String | Format conversion | Fiscal year offset must be configured |
| GL Balance (functional currency) | Data value | Numeric | Direct (sign flip for credits) | Debit/credit sign convention differs between GL and EPM |
| GL Currency Code | Currency dimension | String | ISO 4217 mapping | Multi-currency loads require currency dimension enabled |
| Journal Source | Scenario dimension | String | Conditional mapping | Actuals vs adjustments may need separate scenarios |
| Code | Meaning | Cause | Resolution |
|---|---|---|---|
| 401 | Unauthorized | Expired token, invalid credentials, MFA blocking basic auth | Refresh OAuth token; verify identity domain URL |
| 403 | Forbidden | User lacks Service Administrator role | Assign Service Administrator in identity domain |
| 404 | Not Found | Wrong application name, job not defined, incorrect URL | Verify app name via GET /applications |
| 409 | Conflict | Concurrent operation on same resource | Serialize operations; implement queue-based orchestration |
| 500 | Internal Server Error | Data format error, memory exhaustion, corrupt metadata | Check Activity Reports; review data file format |
| -1 (EPM Automate) | Command failed | Session timeout, file not found, job definition mismatch | Check EPM Automate log file |
Query maintenance window schedule and pad 30 minutes on each side. [src6]Re-authenticate within the script if elapsed time approaches 50 minutes. [src2]Always run metadata import before data import in the pipeline. [src3]Schedule automated loads outside peak SmartView usage hours. [src4]Use incremental aggregation; break into dimension-level partial refreshes. [src1]' BAD - SmartView + VBA requires Excel open, cannot run headless
Sub LoadDataViaSmartView()
' Open SmartView connection, paste data, submit
End Sub
' Scheduled via Windows Task Scheduler — fragile
# GOOD - Headless, scriptable, proper error handling
epmautomate.sh login "$EPM_URL" "$TOKEN_FILE"
epmautomate.sh uploadFile "$DATA_FILE"
epmautomate.sh importData "$APP_NAME" "$JOB_NAME" "$FILENAME"
epmautomate.sh logout
# BAD - Data Management deprecated since July 2023
# Navigate to: EPM Cloud -> Data Management -> Setup -> Register
# This UI will be removed in a future release
# GOOD - Data Integration is the supported path
# Navigate to: EPM Cloud -> Data Integration -> Create Integration
# Select source type, define mappings, schedule
# BAD - Plaintext credentials, no MFA support
headers = {"Authorization": "Basic " + base64.b64encode(b"admin:P@ss").decode()}
requests.get(epm_url, headers=headers)
# GOOD - OAuth 2.0 with credentials from secret manager
import os, requests
token = get_epm_token(
os.environ["EPM_CLIENT_ID"],
os.environ["EPM_CLIENT_SECRET"],
os.environ["EPM_SCOPE"]
)
Always sequence metadata import before data import in your pipeline. [src3]Query maintenance schedule via EPM Automate getMaintenanceWindow; schedule with buffer. [src6]Test integrations against preview environment; subscribe to Oracle EPM Cloud Readiness documents. [src6]Split into multiple files by entity or period; use Data Exchange Pipelines for parallel loads. [src3]Use set -e in bash scripts and check $? after each command. [src7]Establish operational windows — API loads off-hours, SmartView during business hours. [src1]# Test OAuth 2.0 authentication
curl -s -X POST \
"https://idcs-<domain>.identity.oraclecloud.com/oauth2/v1/token" \
-u "<client_id>:<client_secret>" \
-d "grant_type=client_credentials&scope=..." | python3 -m json.tool
# List available EPM applications (verify connectivity + permissions)
curl -s -X GET \
"https://<epm-host>/HyperionPlanning/rest/v3/applications" \
-H "Authorization: Bearer <token>" | python3 -m json.tool
# List files in inbox/outbox
curl -s -X GET \
"https://<epm-host>/interop/rest/11.1.2.3.600/applicationsnapshots" \
-H "Authorization: Bearer <token>" | python3 -m json.tool
# EPM Automate: check environment status
epmautomate.sh login "$EPM_URL" "$TOKEN_FILE"
epmautomate.sh listFiles
epmautomate.sh getMaintenanceWindow
epmautomate.sh logout
| Release | Date | Status | Breaking Changes | Migration Notes |
|---|---|---|---|---|
| 26.01 | 2026-01 | Current | None | -- |
| 25.11 | 2025-11 | Supported | AI-driven planning; new user/role REST APIs | Existing integrations unaffected |
| 25.05 | 2025-05 | Supported | Data Exchange Pipeline improvements | New orchestration features available |
| 23.07 | 2023-07 | Supported | Data Management module deprecated | Migrate DM configs to Data Integration |
| 23.04 | 2023-04 | End of support | REST API v2 endpoints removed | Migrate to v3 REST API endpoints |
Oracle EPM Cloud follows a monthly release cadence with no backward-compatible version pinning. All tenants are auto-upgraded. Deprecated features receive 12-18 months notice via Oracle Cloud Readiness documents. Subscribe to the proactivesupportepm blog for advance notice.
| Use When | Don't Use When | Use Instead |
|---|---|---|
| Loading GL actuals from Oracle ERP Cloud into Planning/FCCS | Need real-time transactional ERP data (< 1 second) | Oracle ERP Cloud APIs directly |
| Automating monthly close consolidation workflows in FCCS | Integrating with non-Oracle ERP without middleware | Oracle Integration Cloud (OIC) + file-based EPM load |
| Finance users need ad hoc planning/analysis in Excel | Headless, automated data entry at scale | REST API or EPM Automate instead of SmartView |
| Pushing approved budgets back to Oracle ERP Cloud as journals | Real-time budget enforcement in ERP transactions | Oracle ERP Budgetary Control module |
| Scheduling nightly data loads from multiple source systems | Event-driven, near-real-time data sync | OIC with Oracle ERP Business Events |
| Capability | Oracle EPM Cloud | SAP BPC (S/4HANA Embedded) | OneStream | Anaplan |
|---|---|---|---|---|
| API Style | REST + EPM Automate CLI | OData v4 + BPC REST | REST API | REST API (Bulk + Transactional) |
| ERP Direct Connect | Oracle ERP Cloud, NetSuite, EBS, PS | SAP S/4HANA native | File-based + connectors | File-based + Cloudworks |
| Authentication | OAuth 2.0, Basic Auth | SAP OAuth 2.0, X.509 | OAuth 2.0 | OAuth 2.0 (certificate auth) |
| Bulk Data Load | File upload + import job | BPC data load via BW | Stage data load | Bulk API (file-based) |
| Excel Integration | SmartView (COM add-in) | Analysis for Office (AfO) | Excel Add-in | Anaplan Add-in |
| CLI Automation | EPM Automate | BPC Process Chains | No native CLI | No native CLI |
| Scheduling | External scheduler + EPM Automate | SAP Process Chains | Built-in scheduler | Cloudworks scheduler |
| Write-back to ERP | Budget Journals (Oracle ERP only) | Native (S/4HANA) | File/API (custom) | File/API (custom) |
| Multi-entity Consolidation | FCCS (full IFRS/GAAP) | BPC Consolidation | Full consolidation | Limited (no statutory) |
| Deployment | Cloud only (OCI SaaS) | On-prem or BTP cloud | Cloud or on-prem | Cloud only |