Oracle Fusion Cloud Financials (also branded Oracle Financials Cloud or Oracle Cloud ERP — Financials pillar) is Oracle's SaaS ERP financial suite. The REST API surface covers General Ledger, Accounts Payable, Accounts Receivable, Cash Management, Expenses, Collections, Tax, and related configuration objects. The API version is tied to Oracle's quarterly release cycle, with the REST resource version remaining at 11.13.18.05 across releases while new endpoints and actions are added each quarter. [src1]
This card covers Oracle Fusion Cloud Financials only — not Oracle E-Business Suite (on-premise, PL/SQL APIs), Oracle NetSuite (separate SaaS product with SuiteTalk/REST APIs), or Oracle Cloud Infrastructure (IaaS). Fixed Assets, Intercompany, and Subledger Accounting have limited REST coverage — bulk operations for these modules require FBDI. [src4]
| Property | Value |
|---|---|
| Vendor | Oracle |
| System | Oracle Fusion Cloud Financials (Release 25D / 26A) |
| API Surface | REST (primary), SOAP (legacy), FBDI (bulk) |
| Current API Version | 11.13.18.05 (resource version, stable across releases) |
| Editions Covered | Enterprise (single edition for cloud) |
| Deployment | Cloud (Oracle Cloud Infrastructure) |
| API Docs | Oracle Fusion Cloud Financials REST API |
| Status | GA — quarterly feature releases (25A through 26A+) |
Oracle Financials Cloud offers three primary integration surfaces, each suited to different volume and latency requirements. [src1, src4]
| API Surface | Protocol | Best For | Max Records/Request | Rate Limit | Real-time? | Bulk? |
|---|---|---|---|---|---|---|
| REST API | HTTPS/JSON | Individual record CRUD, queries | 500 (POST) | Fair-use throttling (429) | Yes | No |
| FBDI | CSV/ZIP via UCM + ESS | Bulk data loads, migrations, journal import | 250 MB per ZIP | ESS job queue (serial) | No | Yes |
| SOAP Web Services | HTTPS/XML | Legacy integrations | Varies | Shared with REST | Yes | No |
| ERP Business Events | HTTPS/JSON (callback) | Event-driven outbound | N/A | Configurable | Yes | N/A |
| BI Publisher Reports | HTTPS/XML or CSV | Bulk data extraction | Report-dependent | ESS scheduler | No | Yes |
| ERP Integrations REST | HTTPS/JSON + file | FBDI uploads + ESS job submission | 1 file per request | ESS job queue | No | Yes |
| Limit Type | Value | Applies To | Notes |
|---|---|---|---|
| Max records per POST | 500 | REST API (all modules) | Oracle recommends limiting to 500 for reliable processing |
| Max FBDI ZIP file size | 250 MB | UCM file upload | Split larger data sets into multiple files |
| Max response page size | 25 (default, configurable) | REST API GET | Use offset + limit for pagination |
| Concurrent ESS jobs | 1 per job type (serial) | FBDI import jobs | Multiple different job types can run in parallel |
| Max attachment size | 2 GB | REST API attachments | Per-file limit for document uploads |
| Limit Type | Value | Window | Edition Differences |
|---|---|---|---|
| REST API calls | No published hard limit | Fair-use | Dynamic throttling — returns 429 when threshold exceeded |
| ESS job submissions | No published hard limit | Per pod | Queued and serialized per job type |
| UCM file uploads | No published hard limit | Per pod | Practical limit driven by storage quota |
| BI Publisher report runs | No published hard limit | Per pod | Subject to ESS scheduler capacity |
Oracle Fusion Cloud does not publish fixed API rate limits. Instead, it applies fair-use throttling at the pod level. When throttled, the API returns HTTP 429 with a Retry-After header. The threshold varies by pod load, time of day, and tenant configuration. There is no self-service way to check remaining quota — implement 429 handling with exponential backoff. [src3]
| Flow | Use When | Token Lifetime | Refresh? | Notes |
|---|---|---|---|---|
| OAuth 2.0 Client Credentials | Server-to-server (recommended) | 3600 seconds | No (re-authenticate) | Register Confidential App in IDCS |
| Basic Auth over SSL | Testing, simple integrations | Session-based | N/A | Not recommended for production |
| SAML 2.0 Bearer Token | SSO-federated user-context | Session timeout | N/A | SAML assertion in HTTP header |
| JWT Bearer Token | Service account access | Configurable | N/A | JWT in HTTP header over SSL |
START — User needs to integrate with Oracle Financials Cloud
|-- What's the financial module?
| |-- General Ledger (GL)
| | |-- Query balances/periods/ledgers? -> REST: GET /ledgerBalances
| | |-- Create individual journals (<10)? -> REST: POST /journalBatches
| | |-- Bulk journal import (>10)? -> FBDI: GlInterface.csv via erpintegrations
| |-- Accounts Payable (AP)
| | |-- Create/update invoices (<500)? -> REST: POST /invoices
| | |-- Bulk invoice import (>500)? -> FBDI or REST /payablesInterfaceInvoices
| | |-- Query invoices/payments/suppliers? -> REST: GET /invoices, /payablesPayments
| |-- Accounts Receivable (AR)
| | |-- Create/update transactions (<500)? -> REST: POST /receivablesInvoices
| | |-- Bulk AR import (>500)? -> FBDI: AutoInvoice import
| | |-- Apply receipts? -> REST: POST /standardReceiptApplications
| |-- Fixed Assets (FA)
| | |-- Query assets? -> REST: GET /assets
| | |-- Bulk asset creation? -> FBDI: FA Mass Additions
| |-- Intercompany -> FBDI: fin/intercompany/import
| |-- Cash Management -> REST: /cashBankAccounts, /cashBankAccountTransfers
|-- Integration pattern?
| |-- Real-time (<500 records) -> REST API
| |-- Batch/Bulk (>500 records) -> FBDI via erpintegrations
| |-- Event-driven (outbound) -> ERP Business Events + callback
| |-- Scheduled extraction -> BI Publisher reports via ESS
|-- Direction?
| |-- Inbound -> REST POST/PATCH or FBDI upload
| |-- Outbound -> REST GET or BI Publisher
| |-- Bidirectional -> REST + FBDI + BI Publisher
|-- Error tolerance?
|-- Zero-loss -> FBDI with job status polling + error report
|-- Best-effort -> REST with retry on 429/5xx
| Module | Resource | Endpoint Path | Operations | Notes |
|---|---|---|---|---|
| GL — Journals | journalBatches | /fscmRestApi/resources/11.13.18.05/journalBatches | GET, POST, PATCH | Child: journalHeaders, journalLines |
| GL — Balances | ledgerBalances | /fscmRestApi/resources/11.13.18.05/ledgerBalances | GET | Query by ledger, period, account |
| GL — Periods | accountingPeriods | /fscmRestApi/resources/11.13.18.05/accountingPeriods | GET, PATCH | Open/close periods |
| AP — Invoices | invoices | /fscmRestApi/resources/11.13.18.05/invoices | GET, POST, PATCH, DELETE | Full CRUD; child: lines, distributions |
| AP — Interface | payablesInterfaceInvoices | /fscmRestApi/resources/11.13.18.05/payablesInterfaceInvoices | GET, POST | Staging table; submit import action |
| AP — Payments | payablesPayments | /fscmRestApi/resources/11.13.18.05/payablesPayments | GET | Read-only payment details |
| AP — Suppliers | suppliers | /fscmRestApi/resources/11.13.18.05/suppliers | GET, POST, PATCH | Supplier master management |
| AR — Invoices | receivablesInvoices | /fscmRestApi/resources/11.13.18.05/receivablesInvoices | GET, POST, PATCH | Child: installments, distributions |
| AR — Credit Memos | receivablesCreditMemos | /fscmRestApi/resources/11.13.18.05/receivablesCreditMemos | GET, POST, PATCH | Credit memo transactions |
| AR — Receipts | standardReceipts | /fscmRestApi/resources/11.13.18.05/standardReceipts | GET, POST | Cash receipt creation |
| Cash Mgmt | cashBankAccounts | /fscmRestApi/resources/11.13.18.05/cashBankAccounts | GET, POST, PATCH | Bank account management |
| Collections | collectionsDelinquencies | /fscmRestApi/resources/11.13.18.05/collectionsDelinquencies | GET, POST, PATCH | Delinquency management |
| Expenses | expenseReports | /fscmRestApi/resources/11.13.18.05/expenseReports | GET, POST, PATCH | Submit action available |
| ERP Integration | erpintegrations | /fscmRestApi/resources/11.13.18.05/erpintegrations | GET, POST | FBDI upload + ESS job submission |
| Business Events | erpBusinessEvents | /fscmRestApi/resources/11.13.18.05/erpBusinessEvents | GET, PATCH | Enable/disable event subscriptions |
Register a Confidential Application in Oracle IDCS, obtain Client ID and Client Secret, then request an access token. [src3]
curl -X POST \
"https://{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:resource:consumer::all"
Verify: Response contains "access_token" field and "expires_in": 3600
Use the ledgerBalances endpoint to retrieve account balances. [src1]
curl -X GET \
"https://{host}.fa.{dc}.oraclecloud.com/fscmRestApi/resources/11.13.18.05/ledgerBalances?q=LedgerName=US%20Primary%20Ledger;AccountingPeriod=Mar-26" \
-H "Authorization: Bearer {access_token}"
Verify: Response contains "items" array with balance data
POST a new invoice with header and line details. [src6]
curl -X POST \
"https://{host}.fa.{dc}.oraclecloud.com/fscmRestApi/resources/11.13.18.05/invoices" \
-H "Authorization: Bearer {access_token}" \
-H "Content-Type: application/vnd.oracle.adf.resourceitem+json" \
-d '{"InvoiceNumber":"INV-2026-001","InvoiceAmount":5000,"BusinessUnit":"US1 Business Unit","Supplier":"Acme Corp"}'
Verify: HTTP 201 with InvoiceId populated
For bulk journal import: prepare CSV, ZIP, base64-encode, upload to UCM, submit ESS job. [src4, src5]
# Step 4a: Upload FBDI ZIP to UCM
curl -X POST ".../erpintegrations" \
-H "Authorization: Bearer {token}" \
-H "Content-Type: application/vnd.oracle.adf.resourceitem+json" \
-d '{"OperationName":"importBulkData","DocumentContent":"{base64_zip}","ContentType":"zip","FileName":"GlInterface.zip","DocumentAccount":"fin$/journal$/import$"}'
# Step 4b: Submit Import Journals ESS Job
curl -X POST ".../erpintegrations" \
-d '{"OperationName":"submitESSJobRequest","JobPackageName":"/oracle/apps/ess/financials/generalLedger/programs/","JobDefName":"JournalImportLauncher","ESSParameters":"..."}'
Verify: Poll GET /erpintegrations/{RequestId} until RequestStatus = SUCCEEDED
POST a receivables invoice for customer billing. [src1]
curl -X POST \
"https://{host}.fa.{dc}.oraclecloud.com/fscmRestApi/resources/11.13.18.05/receivablesInvoices" \
-H "Authorization: Bearer {access_token}" \
-H "Content-Type: application/vnd.oracle.adf.resourceitem+json" \
-d '{"BusinessUnit":"US1 Business Unit","TransactionDate":"2026-03-09","TransactionType":"Invoice","BillToCustomerName":"GlobalTech Inc","CurrencyCode":"USD"}'
Verify: HTTP 201 with CustomerTransactionId populated
Oracle REST API returns paginated results with hasMore, offset, and limit parameters. [src2]
offset = 0
while True:
resp = requests.get(f"{base}/invoices", params={"offset": offset, "limit": 25, "onlyData": "true"}, headers=headers)
data = resp.json()
items.extend(data.get("items", []))
if not data.get("hasMore", False):
break
offset += 25
Oracle returns HTTP 429 when fair-use throttling kicks in. [src3]
import time
def oracle_api_call(url, headers, max_retries=5):
for attempt in range(max_retries):
resp = requests.get(url, headers=headers)
if resp.status_code == 429:
time.sleep(int(resp.headers.get("Retry-After", 2 ** attempt)))
continue
resp.raise_for_status()
return resp.json()
raise Exception(f"Max retries exceeded for {url}")
# Input: Oracle Fusion host, OAuth token, invoice data dict
# Output: Created invoice ID or error details
import requests # requests==2.31.0
def create_ap_invoice(host, token, invoice_data):
url = f"https://{host}/fscmRestApi/resources/11.13.18.05/invoices"
headers = {
"Authorization": f"Bearer {token}",
"Content-Type": "application/vnd.oracle.adf.resourceitem+json"
}
resp = requests.post(url, headers=headers, json=invoice_data)
if resp.status_code == 201:
return {"success": True, "invoice_id": resp.json().get("InvoiceId")}
elif resp.status_code == 429:
return {"success": False, "error": "throttled", "retry_after": resp.headers.get("Retry-After", "60")}
else:
return {"success": False, "status": resp.status_code, "detail": resp.text}
// Input: Oracle host, OAuth token, ledger name, period
// Output: Array of account balance objects
import fetch from 'node-fetch'; // [email protected]
async function getGLBalances(host, token, ledger, period) {
const url = new URL(`https://${host}/fscmRestApi/resources/11.13.18.05/ledgerBalances`);
url.searchParams.set('q', `LedgerName=${ledger};AccountingPeriod=${period}`);
url.searchParams.set('onlyData', 'true');
const resp = await fetch(url.toString(), {
headers: { 'Authorization': `Bearer ${token}` }
});
if (!resp.ok) throw new Error(`GL query failed: ${resp.status}`);
const data = await resp.json();
return data.items || [];
}
# Step 1: Get token
curl -s -X POST \
"https://{idcs}.identity.oraclecloud.com/oauth2/v1/token" \
-u "{client_id}:{client_secret}" \
-d "grant_type=client_credentials&scope=urn:opc:resource:consumer::all"
# Step 2: Test against read-only endpoint
curl -s -X GET \
"https://{host}.fa.{dc}.oraclecloud.com/fscmRestApi/resources/11.13.18.05/ledgersLov" \
-H "Authorization: Bearer {access_token}"
| FBDI Column | GL Interface Field | Type | Required | Notes |
|---|---|---|---|---|
| Status | STATUS | String | Yes | Always "NEW" |
| Ledger Name | LEDGER_NAME | String | Yes | Must match configured ledger |
| Accounting Date | ACCOUNTING_DATE | Date | Yes | Format: YYYY/MM/DD |
| Currency Code | CURRENCY_CODE | String | Yes | ISO 4217 |
| Journal Category | USER_JE_CATEGORY_NAME | String | Yes | Must match defined category |
| Journal Source | USER_JE_SOURCE_NAME | String | Yes | Must match defined source |
| Segment1-30 | SEGMENT1-SEGMENT30 | String | Varies | Per chart of accounts |
| Entered Debit | ENTERED_DR | Number | Conditional | Debit in entered currency |
| Entered Credit | ENTERED_CR | Number | Conditional | Credit in entered currency |
| Code | Meaning | Cause | Resolution |
|---|---|---|---|
| 400 | Bad Request | Invalid JSON, missing required fields | Check field names (case-sensitive), data types |
| 401 | Unauthorized | Invalid/expired access token | Re-authenticate via OAuth |
| 403 | Forbidden | Missing duty role or data access | Assign correct Financials roles to integration user |
| 404 | Not Found | Invalid endpoint or resource ID | Verify resource version and name |
| 409 | Conflict | Record locked or duplicate key | Retry with jitter |
| 429 | Too Many Requests | Fair-use throttling exceeded | Exponential backoff with Retry-After header |
| 500 | Internal Server Error | Transient server-side issue | Retry after 30-60 seconds |
Always poll job status and download error report. [src4]Pre-validate account combinations and split into smaller batches. [src4]Re-authenticate before each poll request. [src3]application/vnd.oracle.adf.resourceitem+json for POST. Fix: Always use ADF Content-Type headers for write operations. [src2]Serialize ESS submissions per job type; poll previous completion first. [src4]Verify intercompany setup for both BUs before importing. [src5]# BAD — creates N API calls for N journals, hits throttling
for journal in journals: # 10,000 journals
requests.post(f"{base}/journalBatches", json=journal, headers=headers)
# GOOD — single file upload + single ESS job for any volume
# Write all journals to GlInterface CSV, ZIP, base64-encode, upload via erpintegrations
requests.post(f"{base}/erpintegrations", json={
"OperationName": "importBulkData",
"DocumentContent": encoded_zip,
"FileName": "GlInterface.zip",
"DocumentAccount": "fin$/journal$/import$"
}, headers=headers)
# BAD — application/json may fail silently for POST/PATCH
curl -X POST .../invoices -H "Content-Type: application/json" -d '{...}'
# GOOD — Oracle requires ADF-specific Content-Type
curl -X POST .../invoices -H "Content-Type: application/vnd.oracle.adf.resourceitem+json" -d '{...}'
# BAD — this endpoint does not exist
requests.post(f"{base}/intercompanyTransactions", json=data, headers=headers)
# Returns 404
# GOOD — FBDI template for intercompany
requests.post(f"{base}/erpintegrations", json={
"OperationName": "importBulkData",
"DocumentContent": encoded_zip,
"FileName": "IntercompanyImport.zip",
"DocumentAccount": "fin$/intercompany$/import$"
}, headers=headers)
Implement exponential backoff with Retry-After from day one. [src3]Always use OAuth 2.0 Client Credentials for production. [src3]Pre-validate via REST GET queries before preparing FBDI files. [src4]Read expires_in from token response, refresh at 90% lifetime. [src3]Use format-specific serialization per API surface. [src1]Always GET the job result file via downloadESSJobExecutionDetails. [src4]# Test OAuth authentication
curl -s -X POST "https://{idcs}.identity.oraclecloud.com/oauth2/v1/token" \
-u "{client_id}:{client_secret}" \
-d "grant_type=client_credentials&scope=urn:opc:resource:consumer::all"
# List available ledgers (verifies connectivity + GL access)
curl -s "https://{host}.fa.{dc}.oraclecloud.com/fscmRestApi/resources/11.13.18.05/ledgersLov?onlyData=true" \
-H "Authorization: Bearer {token}"
# Check ESS job status (after FBDI import)
curl -s "https://{host}.fa.{dc}.oraclecloud.com/fscmRestApi/resources/11.13.18.05/erpintegrations/{RequestId}" \
-H "Authorization: Bearer {token}"
# Verify AP invoice exists
curl -s "https://{host}.fa.{dc}.oraclecloud.com/fscmRestApi/resources/11.13.18.05/invoices?q=InvoiceNumber={num}" \
-H "Authorization: Bearer {token}"
# List enabled Business Events
curl -s "https://{host}.fa.{dc}.oraclecloud.com/fscmRestApi/resources/11.13.18.05/erpBusinessEvents?onlyData=true" \
-H "Authorization: Bearer {token}"
# Describe invoices resource (field metadata)
curl -s "https://{host}.fa.{dc}.oraclecloud.com/fscmRestApi/resources/11.13.18.05/invoices/describe" \
-H "Authorization: Bearer {token}"
| Release | Release Date | Status | Key Changes | Migration Notes |
|---|---|---|---|---|
| 26A | 2026-01 | Current | Payables Interface import action; AR completion via REST | Evaluate submitImportInvoices action |
| 25D | 2025-10 | Supported | New Cash Pool endpoints; Expense Policies | No breaking changes |
| 25C | 2025-07 | Supported | Receivables Credit Memos CRUD; Collections Strategies | New: receivablesCreditMemos |
| 25B | 2025-04 | Supported | Enhanced ledgerBalances query filters | No breaking changes |
| 25A | 2025-01 | Supported | Payables Interface Invoices resource | New: payablesInterfaceInvoices |
| 24D | 2024-10 | Supported | ERP Business Events enhancements | Evaluate event-driven patterns |
| 24C | 2024-07 | Supported | Baseline for current documentation | Minimum recommended version |
Oracle Fusion Cloud follows a quarterly release cadence (A/B/C/D per year). REST API resource version 11.13.18.05 has been stable for multiple years. Oracle provides a minimum 12-month notice before any breaking change via the What's New documentation. [src1]
| Use When | Don't Use When | Use Instead |
|---|---|---|
| Real-time AP invoice creation, <500 per batch | Bulk journal import (>100 journals) | FBDI via erpintegrations endpoint |
| Querying GL balances, AR aging, AP payment status | Creating intercompany transactions | FBDI template fin/intercompany/import |
| Managing suppliers, customers, bank accounts | Fixed Assets mass additions | FBDI FA Mass Additions template |
| Event-driven outbound notifications | Bulk data extraction (>10K records) | BI Publisher scheduled reports |
| AR receipt application and cash posting | Subledger Accounting journal creation | Create Accounting ESS job |
| Expense report submission | Data migration (>100K records) | FBDI with migration templates |