Oracle ERP Cloud FBDI is a platform-level capability available across all Oracle Fusion Cloud Applications editions. It provides a standardized file-based import mechanism using Excel/CSV templates that map directly to interface tables. FBDI covers all major Financials modules (GL, AP, AR, FA, CM), Supply Chain Management, HCM, and Project Management. This card focuses on the Financials modules but the FBDI architecture is identical across all pillars. [src1]
FBDI is not a standalone API — it is a file processing pipeline that can be triggered manually via the Scheduled Processes UI, or programmatically via the ErpIntegrationService SOAP/REST web service (importBulkData operation). For automated integrations, Oracle Integration Cloud (OIC) provides a native ERP Cloud Adapter with a dedicated "Import Bulk Data" action. [src2, src7]
| Property | Value |
|---|---|
| Vendor | Oracle |
| System | Oracle Fusion Cloud ERP (Release 26A) |
| API Surface | File-Based (FBDI) + ErpIntegrationService (SOAP/REST) |
| Current Release | 26A (January 2026) |
| Editions Covered | All editions — FBDI is a core platform capability |
| Deployment | Cloud |
| API Docs | FBDI for Financials |
| Status | GA — actively maintained, templates updated quarterly |
FBDI is not a traditional API but a file-processing pipeline. It can be invoked through multiple channels, each suited to different integration patterns. [src2, src4]
| Channel | Protocol | Best For | Max Records/Job | File Size Limit | Automated? | Bulk? |
|---|---|---|---|---|---|---|
| Manual UI Upload | HTTPS (browser) | Ad-hoc imports, testing | ~100K per CSV | 250 MB ZIP | No | Yes |
| ErpIntegrationService SOAP | SOAP/XML | Server-to-server automation | 2M (20 files x 100K) | 250 MB ZIP | Yes | Yes |
| ErpIntegrationService REST | REST/JSON | Modern server-to-server | 2M (20 files x 100K) | 250 MB ZIP | Yes | Yes |
| OIC ERP Cloud Adapter | Adapter-based | Oracle-to-Oracle, iPaaS orchestration | 2M (20 files x 100K) | 250 MB ZIP | Yes | Yes |
| External Data Loader Client (EDLC) | CLI tool | Large-volume migrations, auto-splits | Unlimited (auto-split) | 250 MB per split | Yes | Yes |
| Limit Type | Value | Applies To | Notes |
|---|---|---|---|
| Max ZIP file size | 250 MB | All channels | Hard limit — UCM rejects larger uploads [src3] |
| Recommended records per CSV | ~100,000 | Each CSV within ZIP | Performance degrades above this; Oracle recommends 10K for error triage [src3, src6] |
| Max CSV files per ZIP | 20 | Per import job | Oracle recommended limit for 2M total records [src3] |
| Max total records per job | ~2,000,000 | Per import job | 20 files x 100K records [src3] |
| Max parallel import batches | 10 | Per Oracle instance | Running more than 10 causes ESS queue contention [src3] |
| Limit Type | Value | Notes |
|---|---|---|
| Concurrent ESS jobs | Instance-dependent | Shared pool with all scheduled processes — not FBDI-specific [src4] |
| Job timeout | Configurable per job | Large imports can run 30+ minutes; monitor via ESS Console [src4] |
| Callback support | Yes | ErpIntegrationService supports web service callbacks on completion [src2] |
| Notification options | Email, Bell, Both, None | 2-digit code: first digit = channel, second = condition [src2] |
| Limit Type | Value | Notes |
|---|---|---|
| Max upload size (ErpIntegrationService) | 250 MB | Base64-encoded content in SOAP/REST payload [src2, src3] |
| Document security group | FAFusionImportExport | Required for FBDI uploads; Attachment group also works [src2] |
| Account path (Financials) | fin$/payables$/import$, fin$/generalLedger$/import$ | Module-specific UCM paths [src7] |
| Flow | Use When | Token Lifetime | Refresh? | Notes |
|---|---|---|---|---|
| Basic Auth | Quick automation, testing | Session-based | N/A | Username:password base64-encoded; works for SOAP/REST [src2] |
| OAuth 2.0 (3-legged) | OIC, external iPaaS | Access: 1h typical | Yes | Requires Oracle Identity Cloud Service (IDCS) setup [src2] |
| OAuth 2.0 (JWT assertion) | Server-to-server, unattended | Configurable | New JWT per request | Recommended for production integrations [src2] |
| SAML assertion | Federated identity scenarios | Session-based | N/A | Complex setup; not recommended for FBDI automation [src2] |
FND_MANAGE_SCHEDULED_PROCESSES_PRIV) to submit ESS jobs via ErpIntegrationService. [src2]DocumentAccount parameter in importBulkData must match the UCM account path for the target module (e.g., fin$/payables$/import$). Wrong path = file uploads but ESS job fails silently. [src7]Load Interface File for Import) loads CSV data into interface tables; Phase 2 (module-specific job like Import Journals) validates and moves data to application tables. Both phases must complete successfully. [src5]jobOptions parameter is mandatory for all programmatic FBDI imports via ErpIntegrationService. Omitting it causes the job to succeed without actually importing data. [src2]START — User needs to bulk-import data into Oracle ERP Cloud
|
+-- What module?
| +-- GL (Journals) --> Template: JournalImportTemplate.xlsm
| | +-- ESS Phase 1: "Load Interface File for Import"
| | +-- ESS Phase 2: "Import Journals"
| | +-- Interface table: GL_INTERFACE
| |
| +-- AP (Invoices) --> Template: PayablesStandardInvoiceImportTemplate.xlsm
| | +-- ESS Phase 1: "Load Interface File for Import"
| | +-- ESS Phase 2: "Import Payables Invoices"
| | +-- Interface tables: AP_INVOICES_INTERFACE, AP_INVOICE_LINES_INTERFACE
| |
| +-- AR (Transactions) --> Template: AutoInvoiceImportTemplate.xlsm
| | +-- ESS Phase 1: "Load Interface File for Import"
| | +-- ESS Phase 2: "Import AutoInvoice"
| | +-- Interface table: RA_INTERFACE_LINES_ALL
| |
| +-- FA (Assets) --> Template: AssetImportTemplate.xlsm
| | +-- ESS Phase 1: "Load Interface File for Import"
| | +-- ESS Phase 2: "Post Mass Additions"
| | +-- Interface table: FA_MASS_ADDITIONS
| |
| +-- Other --> Download module-specific template from Oracle docs
|
+-- How many records?
| +-- < 10,000 --> Single CSV, single job, manual or automated
| +-- 10,000 - 100,000 --> Single CSV, single job, automated
| +-- 100,000 - 2,000,000 --> Split into multiple CSVs (100K each), 1 ZIP
| +-- > 2,000,000 --> Multiple jobs (max 2M per job), max 10 parallel
|
+-- Automation method?
+-- One-time / ad-hoc --> Manual UI upload via Scheduled Processes
+-- Scheduled recurring --> ErpIntegrationService (SOAP/REST)
+-- Oracle-to-Oracle --> OIC with ERP Cloud Adapter
+-- Large migration --> External Data Loader Client (EDLC)
| Step | Action | System | Details |
|---|---|---|---|
| 1 | Download XLSM template | Oracle Docs | Module-specific; re-download each release [src1] |
| 2 | Populate data tab | Excel/ETL | Follow column order exactly; mandatory fields per module [src4] |
| 3 | Generate CSV via macro | Excel | "Generate CSV File" button creates ZIP with CSV(s) + .properties [src5] |
| 4 | Upload ZIP to UCM | UI or API | Manual: Tools > File Import and Export; Automated: importBulkData [src2] |
| 5 | Run "Load Interface File for Import" | ESS | Spawns Transfer File + Load File to Interface child jobs [src5] |
| 6 | Run module-specific import job | ESS | e.g., "Import Journals," "Import Payables Invoices" [src5] |
| 7 | Verify import | ESS Console / UI | Check ESS log for errors; review interface table rejections [src4] |
| 8 | Purge interface tables | ESS | Clean up processed/failed records to prevent reprocessing issues [src8] |
| Module | Template File (XLSM) | Interface Table(s) | ESS Import Job | UCM Account Path |
|---|---|---|---|---|
| GL Journals | JournalImportTemplate.xlsm | GL_INTERFACE | Import Journals | fin$/generalLedger$/import$ |
| AP Invoices | PayablesStandardInvoiceImportTemplate.xlsm | AP_INVOICES_INTERFACE, AP_INVOICE_LINES_INTERFACE | Import Payables Invoices | fin$/payables$/import$ |
| AR Transactions | AutoInvoiceImportTemplate.xlsm | RA_INTERFACE_LINES_ALL | Import AutoInvoice | fin$/receivables$/import$ |
| FA Assets | AssetImportTemplate.xlsm | FA_MASS_ADDITIONS | Post Mass Additions | fin$/fixedAssets$/import$ |
| AP Suppliers | SupplierImportTemplate.xlsm | AP_SUPPLIERS_INT, AP_SUPPLIER_SITES_INT | Import Suppliers | fin$/payables$/import$ |
| CM Bank Statements | BankStatementImportTemplate.xlsm | CE_STATEMENT_HEADERS_INT | Import Bank Statement | fin$/cashManagement$/import$ |
Download the current-release XLSM template from Oracle documentation for your target module. Open in Excel with macros enabled. The template contains an "Instructions and CSV Generation" tab and one or more data tabs. [src1, src5]
# Download GL Journal Import template for Release 26A
# Navigate to: Oracle Help Center > Fusion Cloud Financials > FBDI for Financials
# Download: JournalImportTemplate.xlsm
# Data tab: GL_INTERFACE
# Required columns: Status, Ledger Name, Accounting Date, Journal Source,
# Category, Currency Code, Actual Flag, Entered Debit/Credit,
# Segment1-SegmentN (chart of accounts segments)
Verify: Open XLSM, check version matches your Oracle release (e.g., "26A" in Instructions tab).
Fill in the data tab with your records. Run the "Generate CSV File" macro to produce a ZIP archive containing the CSV file(s) and a .properties file. [src5]
# Click "Generate CSV File" button on Instructions tab
# Output: JournalImportTemplate.zip containing GlInterface.csv + .properties
Verify: Unzip the generated archive and confirm CSV column count matches template definition.
For automated integrations, use the importBulkData operation on the ErpIntegrationService REST endpoint. [src2, src7]
# REST endpoint: POST /fscmRestApi/resources/11.13.18.05/erpintegrations
curl -X POST \
"https://<instance>.fa.us2.oraclecloud.com/fscmRestApi/resources/11.13.18.05/erpintegrations" \
-H "Content-Type: application/json" \
-u "integration_user:password" \
-d '{
"OperationName": "importBulkData",
"DocumentContent": "<base64-encoded-ZIP>",
"ContentType": "zip",
"FileName": "JournalImportTemplate.zip",
"DocumentAccount": "fin$/generalLedger$/import$",
"JobName": "/oracle/apps/ess/financials/generalLedger/programs/,JournalImportLauncher",
"ParameterList": "<LEDGER_ID>#NULL#NULL#NULL#N",
"JobOptions": "InterfaceDetails=2"
}'
# Response: { "ReqstId": 12345678, "RequestStatus": "SUBMITTED" }
Verify: GET ...?finder=ESSJobStatusRF;requestId=12345678 returns "RequestStatus": "SUCCEEDED".
Poll ESS job status and download execution logs for error details. [src2, src4]
# Check job status
curl -s -X GET \
"https://<instance>/fscmRestApi/resources/11.13.18.05/erpintegrations?finder=ESSJobStatusRF;requestId=12345678" \
-u "user:pass"
# Download job log files
curl -s -X POST \
"https://<instance>/fscmRestApi/resources/11.13.18.05/erpintegrations" \
-H "Content-Type: application/json" \
-u "user:pass" \
-d '{"OperationName":"downloadESSJobExecutionDetails","ReqstId":"12345678"}'
Verify: Status is "SUCCEEDED" or "WARNING" (check logs for warning details).
# Input: CSV data file (e.g., GL journals), Oracle ERP Cloud credentials
# Output: ESS job request ID, final job status
import requests
import base64
import time
def fbdi_import(instance_url, username, password, zip_path,
document_account, job_name, parameter_list,
job_options="InterfaceDetails=2"):
"""Upload FBDI ZIP and submit import via ErpIntegrationService REST."""
with open(zip_path, "rb") as f:
doc_content = base64.b64encode(f.read()).decode("utf-8")
endpoint = f"{instance_url}/fscmRestApi/resources/11.13.18.05/erpintegrations"
payload = {
"OperationName": "importBulkData",
"DocumentContent": doc_content,
"ContentType": "zip",
"FileName": zip_path.split("/")[-1],
"DocumentAccount": document_account,
"JobName": job_name,
"ParameterList": parameter_list,
"JobOptions": job_options
}
resp = requests.post(endpoint, json=payload, auth=(username, password))
resp.raise_for_status()
request_id = resp.json().get("ReqstId")
# Poll for completion (max 30 min, 30s intervals)
for attempt in range(60):
time.sleep(30)
status_resp = requests.get(
f"{endpoint}?finder=ESSJobStatusRF;requestId={request_id}",
auth=(username, password))
items = status_resp.json().get("items", [])
if items:
status = items[0].get("RequestStatus", "UNKNOWN")
if status in ("SUCCEEDED", "ERROR", "WARNING"):
return {"request_id": request_id, "status": status}
return {"request_id": request_id, "status": "TIMEOUT"}
# Input: ESS job request ID from importBulkData
# Output: Job status (SUBMITTED, RUNNING, SUCCEEDED, ERROR, WARNING)
curl -s -X GET \
"https://<instance>/fscmRestApi/resources/11.13.18.05/erpintegrations?finder=ESSJobStatusRF;requestId=12345678" \
-u "integration_user:password" | python3 -m json.tool
| CSV Column | Interface Table Column | Type | Required | Gotcha |
|---|---|---|---|---|
| Status | STATUS | String | Yes | Must be "NEW" for new records [src5] |
| Ledger Name | LEDGER_NAME | String | Yes | Must match exactly — case-sensitive [src5] |
| Accounting Date | ACCOUNTING_DATE | Date | Yes | Format: YYYY/MM/DD — not YYYY-MM-DD [src5] |
| Currency Code | CURRENCY_CODE | String | Yes | ISO 4217 — "USD", not "US Dollar" [src5] |
| Entered Debit | ENTERED_DR | Number | Conditional | Either debit or credit per line, not both [src5] |
| Entered Credit | ENTERED_CR | Number | Conditional | Either debit or credit per line, not both [src5] |
| Segment1-SegmentN | SEGMENT1-SEGMENTN | String | Yes | Must match chart of accounts structure [src5] |
| Group ID | GROUP_ID | Number | No | Enables selective batch import — highly recommended [src5] |
| Error | Meaning | Cause | Resolution |
|---|---|---|---|
| FBDI-001: Load File to Interface failed | CSV structure mismatch | Template version mismatch or wrong column count | Re-download template for current release; verify CSV column count [src4] |
| GL-IMPORT: Unbalanced journal | Debit/credit imbalance | Total debits do not equal total credits | Verify amounts; check for rounding errors in currency conversion [src5] |
| AP-IMPORT: Duplicate invoice | Duplicate detection | Same invoice number + supplier + BU exists | Use unique invoice numbers; check existing invoices first [src1] |
| ESS-TIMEOUT | Job exceeded time limit | Too many records or ESS queue congestion | Split into smaller batches; schedule during off-peak hours [src4] |
| UCM-UPLOAD: File too large | 250 MB limit exceeded | ZIP file exceeds UCM upload limit | Split data into multiple ZIP files; submit as separate jobs [src3] |
| INTERFACE-PURGE: Records exist | Stale interface records | Previous failed import left records | Run purge process for the module before resubmitting [src8] |
Re-download templates after every quarterly update and verify column mapping in a test import. [src1, src4]Always chain both ESS jobs; use callbacks or status polling to trigger Phase 2 after Phase 1 completes. [src5]Run the module-specific purge process before every import attempt after a failure. [src8]Save CSV as UTF-8 without BOM; validate encoding before upload. [src4]Limit to 10 parallel batches; implement job queue with sequential submission. [src3]Use exact paths per module — fin$/generalLedger$/import$ for GL, fin$/payables$/import$ for AP. [src7]# BAD — 500,000 records in one CSV file
# Performance degrades exponentially above 100K records
# Error triage is nearly impossible
# ESS job may time out or consume excessive memory
# GOOD — split into manageable batches
# 500K records -> 5 CSV files of 100K each -> 1 ZIP -> 1 job
# Use Group ID to enable selective reprocessing of failed batches
# BAD — submitting "Load Interface File for Import" and assuming done
# Data only reaches interface tables after Phase 1
# Application tables remain unchanged until Phase 2 runs
# GOOD — chain both phases with status checking
result1 = fbdi_import(...) # Phase 1: Load Interface File for Import
if result1["status"] == "SUCCEEDED":
result2 = submit_ess_job( # Phase 2: Module-specific import
job_name="ImportJournals",
parameters={"group_id": batch_group_id}
)
# BAD — import fails, fix CSV, resubmit same batch
# Failed records from attempt 1 still in interface tables
# Result: duplicate processing, constraint violations
# GOOD — clean slate before retry
# 1. Run "Purge Interface Tables" ESS job for the module
# 2. Wait for purge to complete
# 3. Resubmit corrected CSV with both Phase 1 and Phase 2
Download fresh templates after every quarterly release; diff column headers against previous version. [src1, src4]Always use the macro to generate the ZIP, or manually create the .properties file with correct metadata. [src4]Standardize all dates to YYYY/MM/DD before CSV generation. [src5]Always set Interface Group Identifier and pass matching Group ID parameter to Import Journals. [src5]Schedule FBDI imports during off-peak hours or coordinate with the ERP admin team. [src4]Submit Phase 2 via submitESSJobRequest after Phase 1 completes, or use OIC adapter which orchestrates both phases. [src2]# Check ESS job status for a specific request ID
curl -s -X GET \
"https://<instance>/fscmRestApi/resources/11.13.18.05/erpintegrations?finder=ESSJobStatusRF;requestId=<REQUEST_ID>" \
-u "user:pass" | python3 -m json.tool
# Download ESS job log files (base64-encoded ZIP)
curl -s -X POST \
"https://<instance>/fscmRestApi/resources/11.13.18.05/erpintegrations" \
-H "Content-Type: application/json" \
-u "user:pass" \
-d '{"OperationName":"downloadESSJobExecutionDetails","ReqstId":"<REQUEST_ID>"}'
# List documents in UCM by file prefix (verify upload)
curl -s -X POST \
"https://<instance>/fscmRestApi/resources/11.13.18.05/erpintegrations" \
-H "Content-Type: application/json" \
-u "user:pass" \
-d '{"OperationName":"getDocumentIdsForFilePrefix","DocumentPrefix":"JournalImport"}'
# ErpIntegrationService WSDL (19 operations available)
# https://<instance>/fscmService/ErpIntegrationService?WSDL
| Release | Date | Status | Template Changes | Notes |
|---|---|---|---|---|
| 26A | 2026-01 | Current | Updated macro structure in XLSM templates | Re-download all templates |
| 25D | 2025-10 | Supported | Minor column additions in AP/AR templates | Check AP_INVOICE_LINES_INTERFACE for new optional fields |
| 25C | 2025-07 | Supported | No breaking template changes | Stable release for FBDI |
| 25B | 2025-04 | Supported | New FBDI templates for Project Management | No impact on Financials templates |
| 25A | 2025-01 | Supported | ErpIntegrationService documentation refresh | — |
Oracle Fusion Cloud Applications follow a quarterly release cadence (A=Jan, B=Apr, C=Jul, D=Oct). FBDI templates are updated each release but Oracle maintains backward compatibility for at least 2 releases. Using templates more than 2 releases old is unsupported and may cause silent data mapping errors. [src1]
| Use When | Don't Use When | Use Instead |
|---|---|---|
| Bulk data migration (10K-2M records) | Real-time individual record CRUD | Oracle ERP Cloud REST API |
| Scheduled periodic batch imports (daily/weekly journals, invoices) | Outbound data extraction from Oracle | BICC or BIP Reports |
| Data corrections requiring mass updates via interface tables | Low-latency event-driven integrations | Oracle Business Events + OIC |
| Initial data load during implementation | Fewer than 100 records per transaction | REST API with JSON payload |
| Non-Oracle source systems pushing data to Oracle ERP | Oracle-to-Oracle cloud integrations | OIC pre-built integrations or ADM |
jobOptions parameter in ErpIntegrationService is mandatory but poorly documented. Omitting it or using wrong values causes the job to "succeed" without actually processing data. Module-specific values: GL uses InterfaceDetails=2, AP uses InterfaceDetails=1. [src2, src7]