Oracle SCM Cloud API Capabilities — Inventory, Order Management, Shipping & Manufacturing

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

TL;DR

System Profile

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]

PropertyValue
VendorOracle
SystemOracle Fusion Cloud Supply Chain & Manufacturing (SCM)
API SurfaceREST (primary), SOAP (legacy/maintenance), FBDI (bulk), BICC (extraction)
Current API VersionRelease 25D / 26A (resource version 11.13.18.05)
Editions CoveredAll editions — API surface is identical
DeploymentCloud (SaaS only)
API DocsOracle Fusion Cloud SCM REST API
StatusGA (REST); SOAP is maintenance-only for SCM

API Surfaces & Capabilities

API SurfaceProtocolBest ForMax Records/RequestRate LimitReal-time?Bulk?
REST APIHTTPS/JSONIndividual record CRUD, queries <500 records500 (pagination via offset)150-5,000 req/min (domain tier)YesNo
SOAP APIHTTPS/XMLLegacy integrations, metadata opsVaries by serviceShared with RESTYesNo
FBDICSV via UCM + ESSBulk import >500 records, data migration250 MB per fileESS job queue (concurrent limits)NoYes
BICCIncremental extractionOutbound bulk data extraction to BI/DWFull table extractionScheduled (not real-time)NoYes
Business EventsEvent/callback via OICNear-real-time notifications, event-drivenN/A (event payload)Per-event (no throttle on events)YesN/A
Batch RESTHTTPS/JSONMulti-operation in single call50 sub-operationsCounted as 1 requestYesPartial

Rate Limits & Quotas

Per-Request Limits

Limit TypeValueApplies ToNotes
Max records per response500 (499 practical)REST API GETUse offset + limit for pagination; default page size is 25
Max payload size1 MBREST API POST/PATCHLarger payloads rejected with HTTP 413
Max batch sub-operations50Batch REST APIEach sub-operation is one CRUD action
Max FBDI file size250 MBFile-Based Data ImportSplit larger files into multiple uploads
Max query depth3 levelsREST API expand parameterNested child resources limited to 3 levels deep
Max fields per requestNo hard limitREST API fields parameterResponse time degrades beyond 50 fields

Rolling / Daily Limits

Limit TypeValueWindowDomain Tier Differences
REST API requests150-5,000Per minuteFree: 150/min, Oracle Apps: 1,500/min, Premium: 5,000/min
Concurrent ESS jobs4-16Per podDepends on pod size and configuration
FBDI import jobsNo daily capPer ESS queueLimited by concurrent job slots, not daily quota
Business EventsNo explicit capPer eventVolume limited by OIC subscription tier
BICC extractionsScheduledPer configurationTypically 1-4 runs per day

Authentication

FlowUse WhenToken LifetimeRefresh?Notes
OAuth 2.0 Client CredentialsServer-to-server, no user contextConfigurable (default ~60 min)Request new tokenRecommended for integrations; requires confidential app in IAM
OAuth 2.0 JWT BearerServer-to-server with user assertionConfigurable (default ~60 min)New JWT per requestAvoids password expiration issues; requires X.509 certificate
Basic AuthenticationQuick testing, development onlySession-basedNoDo NOT use in production — exposes credentials
SAML 2.0SSO-based user-context accessSession-basedNoUsed with OIC adapter, not direct API calls

Authentication Gotchas

Constraints

Integration Pattern Decision Tree

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

Quick Reference

OperationMethodEndpointModuleNotes
Get on-hand quantitiesGET/fscmRestApi/resources/11.13.18.05/inventoryOnhandBalanceSummariesInventorySummary-level; child resources for serial/lot details
Create transfer orderPOST/fscmRestApi/resources/11.13.18.05/transferOrdersInventorySupports child transferOrderLines
Get movement requestsGET/fscmRestApi/resources/11.13.18.05/inventoryMovementRequestsInventoryTypes: Requisition, Replenishment, Pick Wave, Shop Floor
Create pick slipPOST/fscmRestApi/resources/11.13.18.05/inventoryMovementRequests/{id}/action/createPickSlipInventoryCustom action on movement request
Get shipment linesGET/fscmRestApi/resources/11.13.18.05/shipmentLinesShippingInbound and outbound shipment tracking
Get inbound shipmentsGET/fscmRestApi/resources/11.13.18.05/inboundShipmentsReceivingIncludes child: shipmentLines, attachments
Create supply requestPOST/fscmRestApi/resources/11.13.18.05/supplyRequestsOrchestrationTransfer and purchase supply-order types
Get sales ordersGET/fscmRestApi/resources/11.13.18.05/salesOrdersForOrderHubRequestsOrder MgmtPaginated; child resources for lines, holds
Create sales order actionPOST/fscmRestApi/resources/11.13.18.05/salesOrderActionRequestsOrder MgmtSupports submit, cancel, hold actions
Get discrete work ordersGET/fscmRestApi/resources/11.13.18.05/discreteWorkOrdersManufacturingChild: operations, materials, resources, serials
Get process work ordersGET/fscmRestApi/resources/11.13.18.05/processWorkOrdersManufacturingProcess manufacturing (different from discrete)
Create material transactionPOST/fscmRestApi/resources/11.13.18.05/materialTransactionsManufacturingShop floor to/from subinventory movement
Get dispatch listGET/fscmRestApi/resources/11.13.18.05/dispatchListWorkOrderOperationsManufacturingOperator dispatch queue
Get shipping methodsGET/fscmRestApi/resources/11.13.18.05/carriers/{id}/child/shippingMethodsSCM CommonCarrier service levels and transport methods
Get supply sourcesGET/fscmRestApi/resources/11.13.18.05/availableSupplySourcesOrchestrationSupply sources for transfer order fulfillment

Step-by-Step Integration Guide

1. Authenticate and obtain access token

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.

2. Query on-hand inventory balances

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.

3. Create a sales order via Order Hub

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.

4. Paginate through large result sets

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.

5. Bulk import via FBDI

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.

6. Subscribe to Business Events via OIC

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.

Code Examples

Python: Query Inventory On-Hand Balances

# 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']}")

JavaScript/Node.js: Create Transfer Order with Retry

// 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;
    }
  }
}

cURL: Check Work Order Status

# 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}"

Data Mapping

Field Mapping Reference

Source Field (External)Target Field (Oracle SCM)TypeTransformGotcha
External Order IDSourceTransactionNumberString(50)DirectMust be unique per SourceTransactionSystem
Item SKUProductNumber / ItemNumberString(300)DirectMust match Oracle Item Master; case-sensitive
QuantityOrderedQuantityNumberDirectDecimal precision varies by UOM
Unit of MeasureOrderedUOMString(3)Map to Oracle UOM codeMust use Oracle codes (Ea, Kg, Lb)
Ship-to AddressShipToAddress fieldsMultipleMap to party siteOracle uses party model — need PartyId/PartySiteId
Date/Time*Date fieldsISO 8601Ensure UTC or include offsetOracle stores in UTC; display per user preference
CurrencyCurrencyCodeString(3)ISO 4217 codeMulti-currency must be enabled at org level
StatusStatusCodeString enumMap to Oracle status codesValues are module-specific

Data Type Gotchas

Error Handling & Failure Points

Common Error Codes

CodeMeaningCauseResolution
400Bad RequestInvalid payload, missing required fieldCheck request body against API docs; validate field names
401UnauthorizedExpired or invalid OAuth tokenRefresh token; check scope includes SCM resources
403ForbiddenInsufficient role/data securityGrant integration user SCM duty roles
404Not FoundInvalid endpoint or resource versionVerify resource version (11.13.18.05) and name
429Too Many RequestsRate limit exceeded for identity domainExponential backoff; check domain tier
500Internal Server ErrorServer-side processing failureCheck ESS job logs; may indicate business rule violation
503Service UnavailableMaintenance window or pod restartRetry after 5 minutes; check Oracle Cloud status page

Failure Points in Production

Anti-Patterns

Wrong: Polling REST API every minute for inventory changes

# 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)

Correct: Use Business Events for change notifications

# 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])

Wrong: Using REST API for bulk data migration

# 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"])

Correct: Use FBDI for bulk loads

# 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)

Wrong: Ignoring inline error messages in 200 responses

# 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

Correct: Check response body for embedded errors

# 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')}")

Common Pitfalls

Diagnostic Commands

# 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}'

Version History & Compatibility

API VersionRelease DateStatusBreaking ChangesMigration Notes
26A2026-02CurrentNew inventory RFID events resourceNo breaking changes from 25D
25D2025-10SupportedEnhanced FBDI+REST combined importNew combined FBDI/REST order import endpoint
25C2025-07SupportedNoneDocumentation refresh; new process work order actions
25B2025-04SupportedShip confirm rules resource addedNew shipping management endpoints
25A2025-02SupportedSupply request PATCH requires reference numberMust include SupplyOrderReferenceNumber for updates
24D2024-10SupportedBusiness Events documentation expandedAdditional SCM event types available
24C2024-07Minimum supportedNoneMinimum version for work order material transactions

When to Use / When Not to Use

Use WhenDon't Use WhenUse Instead
Real-time inventory queries for <500 itemsBulk inventory extraction for BI/analyticsBICC (oracle-bicc-data-extraction)
Individual sales order creation/updatesMass order import (>500 orders)FBDI + ESS job (oracle-erp-cloud-fbdi-import)
Work order status checks and updatesFull MES integrationOIC + Business Events (oracle-integration-cloud-capabilities)
Shipment tracking and status queriesWMS system integrationOracle WMS Cloud direct integration
Event-driven notifications via Business EventsSub-second streaming latencyOracle Golden Gate (not supported on SaaS)
Quick lookup of item, org, or UOM master dataFull master data synchronizationBICC incremental extraction + data lake

Important Caveats

Related Units