ERP API Rate Limits Comparison: Salesforce vs SAP vs Oracle vs NetSuite vs Dynamics 365 vs Workday (2026)

Type: ERP Integration Systems: Salesforce, SAP S/4HANA, Oracle Fusion, NetSuite, Dynamics 365, Workday Confidence: 0.85 Sources: 8 Verified: 2026-03-02 Freshness: evolving

TL;DR

System Profile

This card compares API rate limits, throttling mechanisms, and governance models across the six most common enterprise ERP platforms as of early 2026. It covers cloud deployments only — on-premise SAP and Dynamics have different (or no) API throttling models.

SystemRoleAPI SurfaceRate Limit Model
SalesforceCRM + PlatformREST, SOAP, Bulk API 2.0, StreamingHard daily quota by edition
SAP S/4HANA CloudERPOData v2/v4, SOAP, RFCInfrastructure-level (API Management)
Oracle Fusion Cloud ERPERPREST, SOAP, FBDI, BI PublisherPer-request record cap + fair-use
Oracle NetSuiteERPREST, SuiteTalk SOAP, RESTlets, SuiteQLConcurrency slots + rate windows
Dynamics 365 F&OERPOData v4, Custom Services, DMFResource-based + optional user-based
WorkdayHCM + FinancialsREST, SOAP, RaaS, WQLUndocumented / per-tenant

API Surfaces & Capabilities

API SurfaceProtocolBest ForMax Records/RequestRate LimitReal-time?Bulk?
Salesforce RESTHTTPS/JSONIndividual CRUD, <2K records2,000 per query page100K calls/24h (Enterprise)YesNo
Salesforce Bulk API 2.0HTTPS/CSVData migration, >2K records150M per file15,000 batches/24hNoYes
SAP OData v4HTTPS/JSONStandard CRUD, queriesConfigurable ($top)Infrastructure-dependentYesVia $batch
Oracle Fusion RESTHTTPS/JSONStandard CRUD, queries499 per GETFair-use / not publishedYesNo
Oracle Fusion FBDIFile-based/CSVBulk data loadingUnlimited (file-based)Scheduled job queueNoYes
NetSuite RESTHTTPS/JSONIndividual CRUD1,000 per queryConcurrency-governedYesNo
NetSuite SuiteTalk SOAPHTTPS/XMLBulk operations, search1,000 per search pageShared concurrency poolYesPartial
Dynamics 365 ODataHTTPS/JSONStandard CRUD, queries5,000 per page6,000 req/5min/user/serverYesVia $batch
Dynamics 365 DMFFile-basedBulk import/exportUnlimited (file-based)Exempt from API limitsNoYes
Workday RESTHTTPS/JSONIndividual CRUD100 default page sizeNot publicly documentedYesNo
Workday RaaSHTTPS/JSON,CSV,XMLReport extractionUp to 2GB per reportNot publicly documentedNoYes

Rate Limits & Quotas

Per-Request Limits

SystemLimit TypeValueNotes
SalesforceMax records per REST query page2,000Use queryMore/nextRecordsUrl for pagination [src1]
SalesforceMax composite subrequests25All-or-nothing by default [src1]
SalesforceMax request body size50 MBREST API [src1]
SalesforceMax Bulk API file size150 MBPer Bulk API 2.0 job [src1]
Oracle FusionMax records per GET499Hard limit, cannot be overridden [src6]
Oracle FusionMax records per POST500Recommended maximum [src6]
NetSuiteMax objects per query1,000REST defaults to 100 if unspecified [src3]
NetSuiteMax SuiteQL rows100,000Per single query [src3]
Dynamics 365 F&OMax concurrent requests per user52Per user, per app ID, per web server [src2]
SAP S/4HANADefault page size100Configurable via $top; no hard maximum documented [src5]
WorkdayDefault page size100-500Varies by endpoint; 200-500 recommended [src7]

Rolling / Daily Limits

SystemLimit TypeValueWindowEdition / License Differences
SalesforceTotal API calls100,000 base24h rollingEnterprise: 100K + 1,000/user; Unlimited: 5M; Developer: 15,000; Performance: 5M [src1]
SalesforceBulk API batches15,00024h rollingShared across all editions [src1]
SalesforceStreaming events200,00024hHigher with add-on licenses [src1]
SalesforceConcurrent long-running requests25 (prod) / 5 (dev)Per orgRequests running >20 seconds [src1]
Dynamics 365 F&ORequests per user per server6,0005-min sliding windowPer user, per app ID, per web server [src2]
Dynamics 365 F&OExecution time per user per server1,200 seconds5-min sliding windowCombined execution time [src2]
Dynamics 365 DataverseLicensed user requests40,00024hD365 Enterprise/Professional; Team Member: 6,000 [src4]
Dynamics 365 DataverseNon-licensed user pool500,000 base + 5,000/license24hTenant-level, shared; max 10M [src4]
NetSuiteConcurrent requests5-20 baseRollingStandard: 5; Premium: 15; Enterprise/Ultimate: 20; +10 per SuiteCloud Plus [src3, src8]
NetSuitePer-user RESTlet concurrency5RollingHard cap regardless of tier [src3]
Oracle FusionREST API callsNot publishedFair-useThrottles via 429 responses [src6]
SAP S/4HANAAPI callsNot publishedFair-useManaged via API Management policies [src5]
WorkdayAPI callsNot publishedUnknownTenant-specific; contact Workday support [src7]

Transaction / Governor Limits

SystemLimit TypePer-Transaction ValueNotes
SalesforceSOQL queries100 sync / 200 asyncIncludes queries from triggers [src1]
SalesforceDML statements150 sync / 300 asyncEach insert/update/delete counts as 1 [src1]
SalesforceDML records processed10,000Per transaction [src1]
SalesforceCPU time10,000 ms sync / 60,000 ms asyncExceeded = transaction abort [src1]
SalesforceHeap size6 MB sync / 12 MB asyncExceeded = transaction abort [src1]
SalesforceCallouts (HTTP)100Per Apex transaction [src1]
NetSuiteGovernance units per scriptVaries by script typeUnits consumed per API call (e.g., search = 10, record load = 5) [src3]
Dynamics 365 F&OExecution time per requestPart of 1,200s combined poolTracked in 5-min window [src2]

Authentication

SystemPrimary Auth FlowRate Limit TrackingToken LifetimeNotes
SalesforceOAuth 2.0 JWT BearerPer org (daily) + per user (governor)2h default sessionConnected app required [src1]
SAP S/4HANAOAuth 2.0 / X.509 / BasicPer infrastructure policyConfigurableAPI Management handles throttling [src5]
Oracle FusionOAuth 2.0 / Basic AuthPer tenant (fair-use)ConfigurableJWT bearer for server-to-server [src6]
NetSuiteToken-Based Auth (TBA) + OAuth 2.0Per account (concurrency)Token: no expiryTBA tokens can be revoked [src3, src8]
Dynamics 365 F&OOAuth 2.0 (Entra ID)Per user + per app ID + per web serverEntra token: 1h defaultService principals use non-licensed pool [src2, src4]
WorkdayOAuth 2.0 / WS-SecurityPer tenantConfigurableRate limits tied to integration system user [src7]

Authentication Gotchas

Constraints

Integration Pattern Decision Tree

START -- Which ERP system are you integrating with?
|
+-- Salesforce
|   +-- < 2,000 records/operation? --> REST API (100K calls/24h)
|   +-- > 2,000 records? --> Bulk API 2.0 (15K batches/24h, 150MB/file)
|   +-- Need real-time events? --> Platform Events / CDC (200K events/24h)
|   +-- Governor limits concern? --> Batch Apex (async: 200 SOQL, 60s CPU)
|
+-- SAP S/4HANA Cloud
|   +-- Standard CRUD? --> OData v4 (no hard rate limit)
|   +-- Bulk data? --> $batch requests or IDoc/BAPI
|   +-- Need throttling? --> Deploy SAP API Management layer
|
+-- Oracle Fusion Cloud
|   +-- < 500 records? --> REST API (499 max per GET)
|   +-- > 500 records read? --> REST with offset pagination loops
|   +-- Bulk import? --> FBDI (file-based, no API limit)
|   +-- Bulk extract? --> BI Publisher reports / BIP
|
+-- NetSuite
|   +-- < 1,000 records? --> REST API or SuiteQL
|   +-- Concurrency concern? --> Reserve slots via Integration Records
|   +-- Bulk operations? --> SuiteTalk SOAP with saved searches
|   +-- Need real-time? --> RESTlets (5 concurrent per user max)
|
+-- Dynamics 365 F&O
|   +-- Standard CRUD? --> OData v4 (6,000 req/5min/user/server)
|   +-- Bulk import/export? --> DMF (exempt from API limits)
|   +-- High volume real-time? --> Dual Write or Virtual Entities
|   +-- Dataverse (CE)? --> 40,000 req/24h per licensed user
|
+-- Workday
    +-- Standard CRUD? --> REST API (limits undocumented)
    +-- Report extraction? --> RaaS (up to 2GB per report)
    +-- Bulk query? --> WQL (Workday Query Language)
    +-- Always implement --> Retry logic with exponential backoff

Quick Reference

CapabilitySalesforceSAP S/4HANAOracle FusionNetSuiteDynamics 365 F&OWorkday
Daily API limit100K-5M (by edition)Not publishedNot publishedNot published6K/5min/user/serverNot published
Concurrency limit25 long-runningInfrastructureNot published5-20 base slots52/user/serverNot published
Max records/GET2,000Configurable ($top)4991,0005,000100-500
Bulk mechanismBulk API 2.0 (150MB)$batch / IDocFBDI (file)SuiteTalk listsDMF (exempt)RaaS (2GB)
Throttle responseHTTP 429Depends on infraHTTP 429429 (REST) / 403 (SOAP)HTTP 429HTTP 429
Retry-After headerYesDependsNot guaranteedNot guaranteedYesNot documented
Governor/txn limitsYes (extensive)NoNoYes (gov units)Execution time poolNo
Limit transparencyExcellentLowLowGoodGoodPoor
Limit configurabilityBuy add-ons onlyFull (via API Mgmt)NoneBuy SuiteCloud PlusBuy capacity add-onsContact support
Sandbox limitsLower than prodSame as prodSame as prodLower (dev = 5 slots)Same (1 server in trial)Same as prod

Error Handling & Failure Points

Common Error Codes

SystemCodeMeaningCauseResolution
SalesforceREQUEST_LIMIT_EXCEEDEDDaily API limit hitExceeded 24h rolling quotaWait for rolling window reset or purchase add-on API calls [src1]
SalesforceGOVERNOR_LIMITTransaction limit exceededToo many SOQL/DML in one transactionBulkify code; use async processing [src1]
NetSuite429 Too Many RequestsConcurrency/rate exceededAll concurrency slots occupiedExponential backoff; reserve dedicated slots [src3]
NetSuiteSSS_REQUEST_LIMIT_EXCEEDEDRESTlet rate limitPer-user RESTlet concurrency exceededReduce parallel RESTlet calls; max 5 per user [src3]
Dynamics 365429 Too Many RequestsService protection triggered6,000 requests in 5-min window OR resource thresholdRespect Retry-After header; distribute across time [src2]
Oracle Fusion429 Too Many RequestsFair-use throttle triggeredSustained high request volumeImplement backoff; switch to FBDI for bulk [src6]
Workday429 Too Many RequestsRate limit exceededExceeded tenant-specific thresholdExponential backoff with jitter [src7]

Failure Points in Production

Anti-Patterns

Wrong: Assuming all ERPs have the same rate limit model

// BAD -- treating all ERPs like Salesforce with a single daily counter
const MAX_DAILY_CALLS = 100000; // This is Salesforce-specific!
let callCount = 0;

async function callErpApi(erpSystem, endpoint) {
  if (callCount >= MAX_DAILY_CALLS) {
    await waitForReset();
  }
  callCount++;
  return fetch(endpoint);
}

Correct: System-specific rate limit handling

// GOOD -- each ERP has its own throttling model
const rateLimitStrategies = {
  salesforce: { type: 'daily_quota', limit: 100000, window: '24h' },
  netsuite:   { type: 'concurrency', maxSlots: 15, retryOn: [429, 403] },
  dynamics365: { type: 'sliding_window', limit: 6000, window: '300s' },
  oracle_fusion: { type: 'fair_use', retryOn: [429] },
  sap:        { type: 'infrastructure', managed: 'api_management' },
  workday:    { type: 'undocumented', retryOn: [429] },
};

async function callErpApi(erpSystem, endpoint) {
  const strategy = rateLimitStrategies[erpSystem];
  try {
    return await fetchWithRetry(endpoint, strategy);
  } catch (e) {
    if (strategy.retryOn?.includes(e.status)) {
      const retryAfter = e.headers?.get('Retry-After') || 5;
      await sleep(retryAfter * 1000);
      return callErpApi(erpSystem, endpoint);
    }
    throw e;
  }
}

Wrong: Using REST API for bulk data in Oracle Fusion

// BAD -- looping REST calls to import 10,000 records (499 max per request)
for (let offset = 0; offset < 10000; offset += 499) {
  await fetch(`/fscmRestApi/resources/v1/invoices?limit=499&offset=${offset}`);
  // 21 API calls minimum, each potentially throttled
}

Correct: Use FBDI for bulk operations in Oracle Fusion

// GOOD -- use File-Based Data Import for bulk operations
const fbdiPayload = {
  OperationName: "importBulkData",
  DocumentContent: base64EncodedCsv,
  ContentType: "text/csv",
  DocumentAccount: "fin$/journal$/import$"
};
await fetch('/fscmRestApi/resources/v1/erpintegrations', {
  method: 'POST',
  body: JSON.stringify(fbdiPayload)
});

Wrong: Not reserving NetSuite concurrency slots

// BAD -- all integrations compete for the same pool
// Integration A: SOAP sync (holds slots for 5-10s per request)
// Integration B: REST real-time (needs <1s responses)
// Integration C: RESTlet webhooks (blocked by A and B)
// Result: Integration C gets 429 errors during peak hours

Correct: Reserve dedicated concurrency per integration

// GOOD -- allocate slots via NetSuite Integration Records
// Setup > Integration > Integration Management > Integration Governance
// Integration A (SOAP sync): 8 reserved slots
// Integration B (REST real-time): 5 reserved slots
// Integration C (RESTlets): 3 reserved slots
// Unallocated: 1 slot minimum (required by NetSuite)
// Total: 17 slots = Premium tier (15 base + 1 SuiteCloud Plus license)

Common Pitfalls

Diagnostic Commands

# === SALESFORCE: Check remaining API quota ===
curl -H "Authorization: Bearer $SF_TOKEN" \
  "https://yourInstance.salesforce.com/services/data/v62.0/limits" \
  | jq '.DailyApiRequests'
# Returns: { "Max": 100000, "Remaining": 87234 }

# === NETSUITE: Check concurrency governance ===
# Navigate to: Setup > Integration > Integration Management > Integration Governance
# Or use SuiteQL:
curl -X POST "https://ACCOUNT_ID.suitetalk.api.netsuite.com/services/rest/query/v1/suiteql" \
  -H "Authorization: OAuth ..." \
  -d '{"q": "SELECT * FROM integrationGovernance"}'

# === DYNAMICS 365 F&O: Monitor throttling ===
# Check Lifecycle Services (LCS) > Environment Monitoring > Raw Logs
# Filter for: ThrottledRequests

# === DYNAMICS 365 DATAVERSE: Check daily allocation ===
# Power Platform Admin Center > Licensing > Capacity add-ons > Download reports

# === ORACLE FUSION: Test pagination behavior ===
curl -u "user:pass" \
  "https://your-instance.fa.ocs.oraclecloud.com/fscmRestApi/resources/v1/invoices?limit=499&offset=0" \
  | jq '.hasMore'
# If true, increment offset by 499 and repeat

# === SAP S/4HANA: Check API Management metrics ===
# SAP Integration Suite > API Management > Analyze > API Traffic

Cross-System Comparison

CapabilitySalesforceSAP S/4HANAOracle FusionNetSuiteDynamics 365 F&OWorkday
Rate Limit ArchitectureHard daily quota + governor limitsNo built-in; infrastructure-managedFair-use / undocumentedConcurrency slots + rate windowsResource-based + sliding windowUndocumented / per-tenant
Daily API Cap100K-5M by editionUnlimited (without API Mgmt)Not publishedNot published6K/5min/user/server (F&O) or 40K/24h/user (Dataverse)Not published
Concurrency Cap25 long-runningDialog work processesNot published5-20 base + 10/SuiteCloud Plus52/user/app/serverNot published
Max Records/GET2,000Configurable ($top)499 (hard cap)1,0005,000100-500
Bulk APIBulk API 2.0 (150MB/file)$batch, IDoc, BAPIFBDI (file-based)SuiteTalk lists (1K/page)DMF (exempt from limits)RaaS (2GB/report)
Transaction/Governor LimitsYes: 100 SOQL, 150 DML, 10K records, 10s CPUNoNoYes: governance units per scriptCombined execution time poolNo
HTTP 429 + Retry-AfterYes, bothDepends on API Mgmt429 yes, Retry-After not guaranteed429 (REST) / 403 (SOAP)Yes, both429 yes, Retry-After unclear
Limit TransparencyExcellent (API endpoint)LowLowGood (admin panel)Good (admin center)Poor
Buy More CapacityAPI call packsScale infrastructureContact Oracle salesSuiteCloud Plus (+10 slots)Capacity add-on (+50K/24h)Contact Workday
Limit ScopePer org (daily) / per txn (governor)Per tenant (infrastructure)Per tenant (fair-use)Per account (concurrency + rate)Per user + app + serverPer tenant
Sandbox DifferencesLower limits than productionSame as productionSame as productionDeveloper = 5 concurrent maxTrial = 1 web serverSame as production

When to Use / When Not to Use

Use WhenDon't Use WhenUse Instead
Planning integration architecture for multi-ERP environmentsNeed detailed single-system API referenceSystem-specific API capability card
Capacity planning for a new ERP integration projectChoosing which ERP to buybusiness/erp-selection category
Debugging rate limit errors across different ERP systemsNeed authentication flow detailsbusiness/erp-integration/erp-authentication-comparison/2026
Comparing ERP platforms for integration friendlinessNeed bulk import specificsbusiness/erp-integration/erp-bulk-import-comparison/2026
Designing retry/backoff strategy for multi-ERP middlewareNeed code-level API tutorialsSystem-specific API capability card

Important Caveats

Related Units