/fscmRestApi/resources/11.13.18.05/ base path. Use REST for real-time operations under 500 records; use FBDI for bulk imports.Oracle Fusion Cloud Supply Chain & Manufacturing (SCM) is a SaaS-only suite covering inventory management, order management, manufacturing execution, shipping/logistics, procurement, and supply chain planning. The REST API follows the common Oracle Fusion REST framework (same pagination, filtering, and authentication patterns as Oracle ERP Cloud Financials) but exposes SCM-specific resources — work orders, transfer orders, shipment lines, on-hand quantities, and sales order orchestration. All editions share the same API surface; rate limits depend on your identity domain tier. [src1]
| Property | Value |
|---|---|
| Vendor | Oracle |
| System | Oracle Fusion Cloud Supply Chain & Manufacturing (SCM) |
| API Surface | REST (primary), SOAP (legacy/maintenance), FBDI (bulk), BICC (extraction) |
| Current API Version | Release 25D / 26A (resource version 11.13.18.05) |
| Editions Covered | All editions — API surface is identical |
| Deployment | Cloud (SaaS only) |
| API Docs | Oracle Fusion Cloud SCM REST API |
| Status | GA (REST); SOAP is maintenance-only for SCM |
| API Surface | Protocol | Best For | Max Records/Request | Rate Limit | Real-time? | Bulk? |
|---|---|---|---|---|---|---|
| REST API | HTTPS/JSON | Individual record CRUD, queries <500 records | 500 (pagination via offset) | 150-5,000 req/min (domain tier) | Yes | No |
| SOAP API | HTTPS/XML | Legacy integrations, metadata ops | Varies by service | Shared with REST | Yes | No |
| FBDI | CSV via UCM + ESS | Bulk import >500 records, data migration | 250 MB per file | ESS job queue (concurrent limits) | No | Yes |
| BICC | Incremental extraction | Outbound bulk data extraction to BI/DW | Full table extraction | Scheduled (not real-time) | No | Yes |
| Business Events | Event/callback via OIC | Near-real-time notifications, event-driven | N/A (event payload) | Per-event (no throttle on events) | Yes | N/A |
| Batch REST | HTTPS/JSON | Multi-operation in single call | 50 sub-operations | Counted as 1 request | Yes | Partial |
| Limit Type | Value | Applies To | Notes |
|---|---|---|---|
| Max records per response | 500 (499 practical) | REST API GET | Use offset + limit for pagination; default page size is 25 |
| Max payload size | 1 MB | REST API POST/PATCH | Larger payloads rejected with HTTP 413 |
| Max batch sub-operations | 50 | Batch REST API | Each sub-operation is one CRUD action |
| Max FBDI file size | 250 MB | File-Based Data Import | Split larger files into multiple uploads |
| Max query depth | 3 levels | REST API expand parameter | Nested child resources limited to 3 levels deep |
| Max fields per request | No hard limit | REST API fields parameter | Response time degrades beyond 50 fields |
| Limit Type | Value | Window | Domain Tier Differences |
|---|---|---|---|
| REST API requests | 150-5,000 | Per minute | Free: 150/min, Oracle Apps: 1,500/min, Premium: 5,000/min |
| Concurrent ESS jobs | 4-16 | Per pod | Depends on pod size and configuration |
| FBDI import jobs | No daily cap | Per ESS queue | Limited by concurrent job slots, not daily quota |
| Business Events | No explicit cap | Per event | Volume limited by OIC subscription tier |
| BICC extractions | Scheduled | Per configuration | Typically 1-4 runs per day |
| Flow | Use When | Token Lifetime | Refresh? | Notes |
|---|---|---|---|---|
| OAuth 2.0 Client Credentials | Server-to-server, no user context | Configurable (default ~60 min) | Request new token | Recommended for integrations; requires confidential app in IAM |
| OAuth 2.0 JWT Bearer | Server-to-server with user assertion | Configurable (default ~60 min) | New JWT per request | Avoids password expiration issues; requires X.509 certificate |
| Basic Authentication | Quick testing, development only | Session-based | No | Do NOT use in production — exposes credentials |
| SAML 2.0 | SSO-based user-context access | Session-based | No | Used with OIC adapter, not direct API calls |
START — User needs to integrate with Oracle SCM Cloud
├── What's the integration pattern?
│ ├── Real-time (individual records, <1s)
│ │ ├── Data volume < 500 records/operation?
│ │ │ ├── YES → REST API: /fscmRestApi/resources/11.13.18.05/{resource}
│ │ │ └── NO → NOT suitable for REST — use FBDI + ESS job
│ │ └── Need event-driven notifications?
│ │ ├── YES → Business Events via OIC (enable event in SCM Setup first)
│ │ └── NO → REST API polling (acceptable for <1K records)
│ ├── Batch/Bulk (scheduled, high volume)
│ │ ├── Inbound (writing to SCM)?
│ │ │ ├── < 500 records → REST API (simpler, no FBDI overhead)
│ │ │ ├── 500-250,000 records → FBDI: CSV → UCM upload → ESS job
│ │ │ └── > 250,000 records → FBDI with file splitting (250 MB limit)
│ │ └── Outbound (reading from SCM)?
│ │ ├── < 5,000 records → REST API with pagination
│ │ └── > 5,000 records → BICC incremental extraction
│ ├── Event-driven (near-real-time)
│ │ ├── SCM module supports Business Events?
│ │ │ ├── YES → Subscribe via OIC adapter (guaranteed delivery)
│ │ │ └── NO → REST API polling on LastUpdateDate
│ │ └── Need cross-module orchestration?
│ │ ├── YES → OIC with multiple event subscriptions
│ │ └── NO → Single OIC integration with callback
│ └── File-based (CSV/XML)
│ └── FBDI → download template, populate CSV, upload to UCM, trigger ESS
├── Which direction?
│ ├── Inbound → check rate limits + FBDI thresholds
│ ├── Outbound → REST for real-time, BICC for bulk
│ └── Bidirectional → design conflict resolution FIRST
└── Error tolerance?
├── Zero-loss → FBDI (transactional) + OIC error hospital + DLQ
└── Best-effort → REST API with exponential backoff retry
| Operation | Method | Endpoint | Module | Notes |
|---|---|---|---|---|
| Get on-hand quantities | GET | /fscmRestApi/resources/11.13.18.05/inventoryOnhandBalanceSummaries | Inventory | Summary-level; child resources for serial/lot details |
| Create transfer order | POST | /fscmRestApi/resources/11.13.18.05/transferOrders | Inventory | Supports child transferOrderLines |
| Get movement requests | GET | /fscmRestApi/resources/11.13.18.05/inventoryMovementRequests | Inventory | Types: Requisition, Replenishment, Pick Wave, Shop Floor |
| Create pick slip | POST | /fscmRestApi/resources/11.13.18.05/inventoryMovementRequests/{id}/action/createPickSlip | Inventory | Custom action on movement request |
| Get shipment lines | GET | /fscmRestApi/resources/11.13.18.05/shipmentLines | Shipping | Inbound and outbound shipment tracking |
| Get inbound shipments | GET | /fscmRestApi/resources/11.13.18.05/inboundShipments | Receiving | Includes child: shipmentLines, attachments |
| Create supply request | POST | /fscmRestApi/resources/11.13.18.05/supplyRequests | Orchestration | Transfer and purchase supply-order types |
| Get sales orders | GET | /fscmRestApi/resources/11.13.18.05/salesOrdersForOrderHubRequests | Order Mgmt | Paginated; child resources for lines, holds |
| Create sales order action | POST | /fscmRestApi/resources/11.13.18.05/salesOrderActionRequests | Order Mgmt | Supports submit, cancel, hold actions |
| Get discrete work orders | GET | /fscmRestApi/resources/11.13.18.05/discreteWorkOrders | Manufacturing | Child: operations, materials, resources, serials |
| Get process work orders | GET | /fscmRestApi/resources/11.13.18.05/processWorkOrders | Manufacturing | Process manufacturing (different from discrete) |
| Create material transaction | POST | /fscmRestApi/resources/11.13.18.05/materialTransactions | Manufacturing | Shop floor to/from subinventory movement |
| Get dispatch list | GET | /fscmRestApi/resources/11.13.18.05/dispatchListWorkOrderOperations | Manufacturing | Operator dispatch queue |
| Get shipping methods | GET | /fscmRestApi/resources/11.13.18.05/carriers/{id}/child/shippingMethods | SCM Common | Carrier service levels and transport methods |
| Get supply sources | GET | /fscmRestApi/resources/11.13.18.05/availableSupplySources | Orchestration | Supply sources for transfer order fulfillment |
Obtain an OAuth 2.0 access token from the Fusion Applications Identity Domain using Client Credentials flow. [src5]
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 with a JWT string and expires_in value.
Use the inventoryOnhandBalanceSummaries resource to check current stock levels for a specific item and organization. [src1]
curl -X GET "https://{host}/fscmRestApi/resources/11.13.18.05/inventoryOnhandBalanceSummaries?q=ItemNumber='AS54888';OrganizationCode='M1'&limit=500" \
-H "Authorization: Bearer {access_token}"
Verify: Response JSON contains items array with OnhandQuantity, ReservedQuantity, and AvailableQuantity fields.
Submit a new sales order through Order Management. Uses an action request pattern for asynchronous order processing. [src3]
curl -X POST "https://{host}/fscmRestApi/resources/11.13.18.05/salesOrdersForOrderHub" \
-H "Authorization: Bearer {access_token}" \
-H "Content-Type: application/json" \
-d '{"SourceTransactionNumber":"EXT-SO-001","SourceTransactionSystem":"EXTERNAL_SYSTEM","BuyingPartyName":"Acme Corp","lines":[{"SourceTransactionLineNumber":"1","ProductNumber":"AS54888","OrderedQuantity":10,"OrderedUOM":"Ea"}]}'
Verify: Response returns HeaderId and processing status. Poll salesOrderActionRequests/{id} for completion.
Oracle SCM REST API returns max 500 records per call. Use offset and limit parameters. Check hasMore flag. [src1]
# First page
curl -X GET "https://{host}/fscmRestApi/resources/11.13.18.05/shipmentLines?limit=500&offset=0" \
-H "Authorization: Bearer {access_token}"
# Subsequent pages
curl -X GET "https://{host}/fscmRestApi/resources/11.13.18.05/shipmentLines?limit=500&offset=500" \
-H "Authorization: Bearer {access_token}"
Verify: When hasMore: false, all records have been retrieved.
For bulk operations, upload a CSV to UCM and trigger an ESS import job. Recommended for data migration and batch loads. [src3]
# Upload CSV to UCM
curl -X POST "https://{host}/fscmRestApi/resources/11.13.18.05/erpintegrations" \
-H "Authorization: Bearer {access_token}" \
-H "Content-Type: application/json" \
-d '{"OperationName":"importBulkData","DocumentContent":"BASE64_ENCODED_ZIP","ContentType":"zip","FileName":"SalesOrderImport.zip"}'
# Trigger ESS import job
curl -X POST "https://{host}/fscmRestApi/resources/11.13.18.05/erpintegrations" \
-H "Authorization: Bearer {access_token}" \
-H "Content-Type: application/json" \
-d '{"OperationName":"submitESSJobRequest","JobPackageName":"/oracle/apps/ess/scm/doo/decomposition/receiveSalesOrder","JobDefName":"ImportOrdersJob","ESSParameters":"EXTERNAL_SYSTEM,N,Y"}'
Verify: Poll job status via GET erpintegrations?finder=ESSJobStatusRF;requestId={ReqstId} until SUCCEEDED.
For event-driven integration, subscribe to SCM Business Events through Oracle Integration Cloud. Events must be enabled in SCM Setup. [src4]
OIC Integration Flow:
1. Create OIC integration with Oracle ERP Cloud Adapter as trigger
2. Select "Subscribe to Business Events" connection type
3. Choose SCM event (e.g., SalesOrderEvent, InventoryTransactionEvent)
4. Map event payload to target system
5. Activate integration
Verify: In OIC Monitoring, confirm integration shows "Active" and events are received after a test transaction.
# Input: OAuth2 credentials (client_id, client_secret), item number, org code
# Output: On-hand quantity details for the specified item
import requests
from requests.auth import HTTPBasicAuth
FUSION_HOST = "https://your-instance.fa.us2.oraclecloud.com"
IAM_HOST = "https://your-domain.identity.oraclecloud.com"
# Get OAuth token
token_resp = requests.post(
f"{IAM_HOST}/oauth2/v1/token",
auth=HTTPBasicAuth("client_id", "client_secret"),
data={"grant_type": "client_credentials", "scope": "urn:opc:resource:consumer::all"}
)
access_token = token_resp.json()["access_token"]
# Query on-hand balances
headers = {"Authorization": f"Bearer {access_token}"}
resp = requests.get(
f"{FUSION_HOST}/fscmRestApi/resources/11.13.18.05/inventoryOnhandBalanceSummaries",
headers=headers,
params={"q": "ItemNumber='AS54888';OrganizationCode='M1'", "limit": 500}
)
for item in resp.json().get("items", []):
print(f"Item: {item['ItemNumber']}, On-Hand: {item['OnhandQuantity']}")
// Input: OAuth2 token, source/destination org, item details
// Output: Transfer order ID and status
const axios = require('axios'); // v1.6+
const FUSION_HOST = 'https://your-instance.fa.us2.oraclecloud.com';
async function createTransferOrder(token, sourceOrg, destOrg, item, qty) {
const resp = await axios.post(
`${FUSION_HOST}/fscmRestApi/resources/11.13.18.05/transferOrders`,
{ SourceOrganizationCode: sourceOrg, DestinationOrganizationCode: destOrg,
transferOrderLines: [{ ItemNumber: item, Quantity: qty, UOM: 'Ea' }] },
{ headers: { Authorization: `Bearer ${token}` } }
);
return resp.data;
}
async function withRetry(fn, maxRetries = 5) {
for (let i = 0; i < maxRetries; i++) {
try { return await fn(); } catch (err) {
if (err.response?.status === 429 && i < maxRetries - 1) {
await new Promise(r => setTimeout(r, Math.pow(2, i) * 1000));
} else throw err;
}
}
}
# Input: Access token, work order number
# Output: Work order status, operation details
curl -X GET "https://{host}/fscmRestApi/resources/11.13.18.05/discreteWorkOrders?q=WorkOrderNumber='WO-001'&expand=operations,operations.materials&fields=WorkOrderNumber,WorkOrderStatusCode,PlannedStartDate" \
-H "Authorization: Bearer {access_token}"
| Source Field (External) | Target Field (Oracle SCM) | Type | Transform | Gotcha |
|---|---|---|---|---|
| External Order ID | SourceTransactionNumber | String(50) | Direct | Must be unique per SourceTransactionSystem |
| Item SKU | ProductNumber / ItemNumber | String(300) | Direct | Must match Oracle Item Master; case-sensitive |
| Quantity | OrderedQuantity | Number | Direct | Decimal precision varies by UOM |
| Unit of Measure | OrderedUOM | String(3) | Map to Oracle UOM code | Must use Oracle codes (Ea, Kg, Lb) |
| Ship-to Address | ShipToAddress fields | Multiple | Map to party site | Oracle uses party model — need PartyId/PartySiteId |
| Date/Time | *Date fields | ISO 8601 | Ensure UTC or include offset | Oracle stores in UTC; display per user preference |
| Currency | CurrencyCode | String(3) | ISO 4217 code | Multi-currency must be enabled at org level |
| Status | StatusCode | String enum | Map to Oracle status codes | Values are module-specific |
q=ItemNumber='as54888' returns no results if stored as AS54888. [src1]Ea, "Kilogram" is Kg. UOM must exist in Oracle's UOM class. [src2]| Code | Meaning | Cause | Resolution |
|---|---|---|---|
| 400 | Bad Request | Invalid payload, missing required field | Check request body against API docs; validate field names |
| 401 | Unauthorized | Expired or invalid OAuth token | Refresh token; check scope includes SCM resources |
| 403 | Forbidden | Insufficient role/data security | Grant integration user SCM duty roles |
| 404 | Not Found | Invalid endpoint or resource version | Verify resource version (11.13.18.05) and name |
| 429 | Too Many Requests | Rate limit exceeded for identity domain | Exponential backoff; check domain tier |
| 500 | Internal Server Error | Server-side processing failure | Check ESS job logs; may indicate business rule violation |
| 503 | Service Unavailable | Maintenance window or pod restart | Retry after 5 minutes; check Oracle Cloud status page |
Always check ESS job output file, not just status — download output via UCM and inspect error rows. [src3]After each quarterly update, verify Business Event enablement in SCM Setup. [src4]Use inventoryOnhandBalanceSummaries and add unique query parameter to bypass caching. [src1]Check response body for embedded errors in informationalMessage field — Oracle returns 200 with inline errors. [src2]In IAM confidential app, ensure scope includes SCM-specific resource types. [src5]Add date filter (LastUpdateDate < pagination_start_time) to freeze result set. [src1]# BAD — consumes rate limit budget, returns entire dataset each time
while True:
resp = requests.get(f"{host}/fscmRestApi/.../inventoryOnhandBalanceSummaries?limit=500")
process_all_records(resp.json()["items"])
time.sleep(60)
# GOOD — event-driven: OIC receives inventory event, calls your webhook
@app.route('/webhook/inventory-change', methods=['POST'])
def handle_inventory_event(event_payload):
item_id = event_payload['ItemId']
resp = requests.get(f"{host}/fscmRestApi/.../inventoryOnhandBalanceSummaries?q=ItemId={item_id}")
update_local_cache(resp.json()["items"][0])
# BAD — paginating 50K records via REST hits rate limits, takes hours
for offset in range(0, 50000, 500):
resp = requests.get(f"{host}/fscmRestApi/.../items?limit=500&offset={offset}")
insert_to_target(resp.json()["items"])
# GOOD — FBDI for bulk: CSV template → UCM upload → ESS job
import base64, zipfile, io
csv_data = generate_fbdi_csv(source_records)
zip_buffer = io.BytesIO()
with zipfile.ZipFile(zip_buffer, 'w') as zf:
zf.writestr('ItemImport.csv', csv_data)
encoded = base64.b64encode(zip_buffer.getvalue()).decode()
requests.post(f"{host}/fscmRestApi/.../erpintegrations", json={
"OperationName": "importBulkData", "DocumentContent": encoded,
"ContentType": "zip", "FileName": "ItemImport.zip"
}, headers=auth_headers)
# BAD — assumes 200 means success
resp = requests.post(f"{host}/fscmRestApi/.../transferOrders", json=payload)
if resp.status_code == 200:
print("Success!") # May have validation errors in response body
# GOOD — inspect informationalMessage for embedded errors
resp = requests.post(f"{host}/fscmRestApi/.../transferOrders", json=payload, headers=auth_headers)
data = resp.json()
if resp.status_code == 200:
errors = data.get("informationalMessage", [])
if any(msg.get("severity") == "ERROR" for msg in errors):
raise ValueError(f"Oracle returned 200 with errors: {errors}")
print(f"Transfer order created: {data.get('OrderNumber')}")
discreteWorkOrders; process uses processWorkOrders. Wrong endpoint returns 404 or empty results. Fix: Check org's manufacturing type in SCM Setup before choosing endpoint. [src1]Enable at Setup > SCM > Business Events, then create OIC subscription. [src4]Use Describe endpoint (GET /fscmRestApi/resources/) to discover current versions. [src1]Append timestamp or UUID: ItemImport_20260309_143022.zip. [src3]Check Oracle Cloud status page for SCM-specific maintenance. [src2]Queue jobs with 30-second delays; monitor ESS job slots before submitting. [src3]# Test authentication — get token and verify
curl -s -X POST "https://{iam-host}/oauth2/v1/token" \
-u "{client_id}:{client_secret}" \
-d "grant_type=client_credentials&scope=urn:opc:resource:consumer::all" | jq .access_token
# Check API availability — discover available resources
curl -s -X GET "https://{host}/fscmRestApi/resources/" \
-H "Authorization: Bearer {token}" | jq '.items[] | .name'
# Verify SCM access — list inventory organizations
curl -s -X GET "https://{host}/fscmRestApi/resources/11.13.18.05/inventoryOrganizations?limit=5" \
-H "Authorization: Bearer {token}" | jq '.items[] | {name: .OrganizationCode}'
# Check on-hand quantity for specific item
curl -s -X GET "https://{host}/fscmRestApi/resources/11.13.18.05/inventoryOnhandBalanceSummaries?q=ItemNumber='AS54888'&limit=5" \
-H "Authorization: Bearer {token}" | jq '.items[0]'
# Monitor ESS job status (FBDI imports)
curl -s -X GET "https://{host}/fscmRestApi/resources/11.13.18.05/erpintegrations?finder=ESSJobStatusRF;requestId={job_id}" \
-H "Authorization: Bearer {token}" | jq '.items[0] | {status: .RequestStatus}'
| API Version | Release Date | Status | Breaking Changes | Migration Notes |
|---|---|---|---|---|
| 26A | 2026-02 | Current | New inventory RFID events resource | No breaking changes from 25D |
| 25D | 2025-10 | Supported | Enhanced FBDI+REST combined import | New combined FBDI/REST order import endpoint |
| 25C | 2025-07 | Supported | None | Documentation refresh; new process work order actions |
| 25B | 2025-04 | Supported | Ship confirm rules resource added | New shipping management endpoints |
| 25A | 2025-02 | Supported | Supply request PATCH requires reference number | Must include SupplyOrderReferenceNumber for updates |
| 24D | 2024-10 | Supported | Business Events documentation expanded | Additional SCM event types available |
| 24C | 2024-07 | Minimum supported | None | Minimum version for work order material transactions |
| Use When | Don't Use When | Use Instead |
|---|---|---|
| Real-time inventory queries for <500 items | Bulk inventory extraction for BI/analytics | BICC (oracle-bicc-data-extraction) |
| Individual sales order creation/updates | Mass order import (>500 orders) | FBDI + ESS job (oracle-erp-cloud-fbdi-import) |
| Work order status checks and updates | Full MES integration | OIC + Business Events (oracle-integration-cloud-capabilities) |
| Shipment tracking and status queries | WMS system integration | Oracle WMS Cloud direct integration |
| Event-driven notifications via Business Events | Sub-second streaming latency | Oracle Golden Gate (not supported on SaaS) |
| Quick lookup of item, org, or UOM master data | Full master data synchronization | BICC incremental extraction + data lake |