Infor CloudSuite API Surfaces: M3 vs LN vs CloudSuite Industrial

Type: ERP Integration System: Infor M3, LN, CSI (ION API Gateway) Confidence: 0.82 Sources: 8 Verified: 2026-03-02 Freshness: 2026-03-02

TL;DR

System Profile

This card compares the API surfaces across the three major Infor CloudSuite ERP product lines: M3 (manufacturing/distribution), LN (industrial enterprise), and CloudSuite Industrial/CSI (formerly SyteLine). All three are deployed on Infor OS in the cloud and share the ION API Gateway as the external-facing API proxy, but each product has a distinct native API architecture. This card does NOT cover Infor CloudSuite Financials (Lawson), Infor EAM, or Infor WMS as standalone API surfaces. [src1, src2]

SystemRoleAPI SurfaceDirection
Infor M3Manufacturing/Distribution ERPMIProgram REST (6,000+ transactions) via ION API GatewayBidirectional
Infor LNIndustrial Enterprise ERPOData REST APIs (modeled via ttadv2570m700) via ION API GatewayBidirectional
Infor CSI (SyteLine)Industrial Manufacturing ERPIDO REST/SOAP web services via ION API GatewayBidirectional
ION API GatewayUnified API proxy (Infor OS)OAuth 2.0 + throttling + routingOrchestrator
Infor Data LakeBulk data retrievalCompass SQL API / Data FabricOutbound (read)
ION (Middleware)Event-driven messagingBOD XML documentsBidirectional

API Surfaces & Capabilities

Each CloudSuite product exposes different native API surfaces, all accessible through the ION API Gateway. The gateway adds OAuth 2.0 security, throttling, and routing but does not normalize the underlying API patterns. [src1, src2]

API SurfaceProductProtocolBest ForMax Records/RequestRate LimitReal-time?Bulk?
MIProgram RESTM3HTTPS/JSON or XMLIndividual record CRUD, business logic~1,000 (maxrecs)ION Gateway throttlingYesNo
M3 BOD (via ION)M3XML/BODEvent-driven, async replicationPer-BODION message throughputAsyncYes
OData REST APILNHTTPS/JSON (OData v4)CRUD, filtered queries, paginationOData page sizeION Gateway throttlingYesLimited
LN BOD (via ION)LNXML/BODEvent-driven, cross-app integrationPer-BODION message throughputAsyncYes
LN SOAPLNHTTPS/XMLLegacy integrations, complex transactionsPer-operationION Gateway throttlingYesNo
IDO RESTCSIHTTPS/JSONIDO object CRUD, queriesIDO-dependentION Gateway throttlingYesNo
IDO SOAPCSIHTTPS/XMLLegacy .NET integrationsIDO-dependentION Gateway throttlingYesNo
CSI BOD (via ION)CSIXML/BODAsync event-driven messagingPer-BODION message throughputAsyncYes
Data Lake / CompassAllSQL API / HTTPSBulk data extraction, analyticsUnlimited (query)Query concurrencyNear-RT (~10 min)Yes

Rate Limits & Quotas

Per-Request Limits

Limit TypeValueApplies ToNotes
M3 MIProgram max records~1,000 defaultMIProgram REST executeUse maxrecs matrix parameter to adjust
LN OData page sizeServer-configuredLN OData REST APIUse $top and $skip or @odata.nextLink
CSI IDO result setIDO-configuredCSI IDO REST/SOAPDepends on IDO definition
BOD message size~10 MB typicalION BOD messagingLarge payloads should be chunked

Rolling / Daily Limits

Limit TypeValueWindowProduct Differences
ION API Gateway throttlingConfigurable per-endpointPer time period (e.g., 60s)Spike arrest + rate smoothing configurable
ION BOD throughputTenant-dependentPer-minute/hourShared across all apps on tenant
Data Lake query concurrencyTenant-dependentConcurrentLimited concurrent Compass queries
OAuth token requestsNot publicly documentedPer-tenantToken endpoint has rate limiting

ION API Gateway Throttling Configuration

The gateway supports configurable throttling policies per endpoint: timePeriodInMilliseconds (e.g., 60,000ms), spikeArrest.maxRequestsPerPeriod (e.g., 1,000), rateSmoothing.delayAfterCount (e.g., 1,000), rateSmoothing.delayFactorInMilliseconds (e.g., 1,000ms). [src2]

Authentication

All three CloudSuite products authenticate external API consumers through the ION API Gateway using OAuth 2.0. [src5, src8]

FlowUse WhenToken LifetimeRefresh?Notes
Authorization CodeNative mobile/desktop/web appsAccess: ~2hYes (30-day grant default)Requires user interaction for consent
Resource Owner PasswordServer-to-server backend servicesAccess: ~2hYesRequires Service Account AccessKey + SecretKey + ClientID + ClientSecret
Client CredentialsMachine-to-machineAccess: ~2hNoSimpler but limited to app-level permissions
SAML BearerInfor Ming.le embedded appsAccess: ~2hYesMing.le context only
ImplicitSingle-page apps (deprecated)Access: ~2hNoDeprecated in OAuth 2.1; avoid for new dev

Authentication Gotchas

Constraints

Integration Pattern Decision Tree

START -- Integrate with Infor CloudSuite (M3, LN, or CSI)
|-- Which CloudSuite product?
|   |-- M3 (CloudSuite Distribution/Fashion/Equipment)
|   |   |-- Individual record CRUD (< 1,000 records)
|   |   |   --> MIProgram REST: /M3/m3api-rest/execute/{Program}/{Transaction}
|   |   |-- Bulk data extraction (> 10,000 records)
|   |   |   --> Data Lake + Compass SQL API
|   |   |-- Event-driven (react to M3 changes)
|   |       --> ION BOD document flows
|   |-- LN (CloudSuite Industrial Enterprise)
|   |   |-- Standard CRUD (procurement, logistics, finance)
|   |   |   --> OData REST API: /lnapi/odata/tdapi.{resource}
|   |   |-- Custom entity CRUD --> Model in ttadv2570m700, then OData
|   |   |-- Complex transactions --> SOAP web services via ION
|   |   |-- Bulk data --> Data Lake + Compass
|   |-- CSI / SyteLine
|       |-- IDO object CRUD --> IDO REST web service via ION
|       |-- Legacy .NET --> IDO SOAP or .NET extension class
|       |-- Event-driven --> ION BOD or IDO Request XML
|       |-- Bulk data --> Data Lake + Compass
|-- Data direction?
|   |-- Inbound (write) --> REST APIs
|   |-- Outbound (read) --> REST (real-time) or Data Lake (bulk)
|   |-- Bidirectional --> REST for writes + BOD/Data Lake for changes
|-- Error tolerance?
    |-- Zero-loss --> ION BOD with connection point monitoring
    |-- Best-effort --> REST API with application-level retry

Quick Reference

CapabilityM3LNCSI (SyteLine)
Primary REST SurfaceMIProgram REST (/m3api-rest/execute/)OData v4 (/lnapi/odata/)IDO REST web services
API Transaction Count6,000+ pre-builtMust be modeled (ttadv2570m700)IDO-registered objects only
Request MethodGET onlyGET, POST, PATCH, DELETEGET, POST, PUT, DELETE
Response FormatJSON or XMLJSON (OData)JSON or XML
URL Pattern/M3/m3api-rest/execute/{Prog}/{Txn}/lnapi/odata/tdapi.{Resource}/IDORequestService/
Paginationmaxrecs matrix paramOData $top, $skip, nextLinkIDO-specific paging
FilteringQuery string paramsOData $filter, $select, $expandIDO property filters
Event-DrivenION BODION BODION BOD or IDO Request XML
Bulk DataData Lake / CompassData Lake / CompassData Lake / Compass
Auth (Cloud)OAuth 2.0 (ION Gateway)OAuth 2.0 (ION Gateway)OAuth 2.0 (ION Gateway)
SOAP SupportLimited / legacyFull SOAPFull IDO SOAP
Standards ComplianceProprietary RESTOData v4Proprietary REST/SOAP

Step-by-Step Integration Guide

1. Obtain ION API credentials from Infor OS

Navigate to Infor OS > ION API > Authorized Apps. Register your external application and download the .ionapi credentials file. [src5]

{
  "ti": "TenantID",
  "cn": "ClientName",
  "ci": "ClientID_GUID",
  "cs": "ClientSecret",
  "iu": "https://{tenant}.ionapi.{region}.inforcloudsuite.com",
  "pu": "https://{tenant}.ionapi.{region}.inforcloudsuite.com/{tenant}/as/token.oauth2",
  "saak": "ServiceAccountAccessKey",
  "sask": "ServiceAccountSecretKey"
}

Verify: .ionapi file downloads with all required fields (ci, cs, pu, saak, sask).

2. Acquire OAuth 2.0 access token

Use Resource Owner Password grant for server-to-server. [src5, src8]

curl -s -X POST "{token_endpoint}" \
  -H "Content-Type: application/x-www-form-urlencoded" \
  -u "{ClientID}:{ClientSecret}" \
  -d "grant_type=password&username={AccessKey}&password={SecretKey}"

Verify: Response contains access_token with expires_in: ~7200.

3. Call M3 MIProgram REST API

All M3 API calls use GET through the execute endpoint. [src3]

curl -s "{base}/M3/m3api-rest/execute/CRS610MI/LstByNumber;maxrecs=20?CONO=1" \
  -H "Authorization: Bearer {token}" \
  -H "Accept: application/json"

Verify: Response contains MIRecord array with NameValue pairs. HTTP 200.

4. Call LN OData REST API

LN supports standard OData query operators. [src4]

curl -s "{base}/lnapi/odata/tdapi.PurchaseOrders?$top=10&$select=OrderNumber,Supplier" \
  -H "Authorization: Bearer {token}" \
  -H "Accept: application/json"

Verify: Response contains @odata.context and value array.

Code Examples

Python: Query M3 customers via MIProgram REST

# Input:  .ionapi credentials file path
# Output: List of M3 customer records

import json
import requests

with open("credentials.ionapi", "r") as f:
    creds = json.load(f)

# Acquire token (Resource Owner grant)
token_resp = requests.post(
    creds["pu"],
    auth=(creds["ci"], creds["cs"]),
    data={
        "grant_type": "password",
        "username": creds["saak"],
        "password": creds["sask"],
    },
)
access_token = token_resp.json()["access_token"]

# Call M3 MIProgram
headers = {"Authorization": f"Bearer {access_token}", "Accept": "application/json"}
resp = requests.get(
    f"{creds['iu']}/M3/m3api-rest/execute/CRS610MI/LstByNumber;maxrecs=100?CONO=1",
    headers=headers,
)

for record in resp.json().get("MIRecord", []):
    fields = {nv["Name"]: nv["Value"] for nv in record["NameValue"]}
    print(f"Customer: {fields['CUNO']} - {fields['CUNM']}")

JavaScript/Node.js: Query LN OData API

// Input:  .ionapi credentials, LN OData resource
// Output: LN purchase orders

const fetch = require("node-fetch"); // npm install node-fetch@2
const fs = require("fs");
const creds = JSON.parse(fs.readFileSync("credentials.ionapi", "utf8"));

async function getLnData() {
  const tokenResp = await fetch(creds.pu, {
    method: "POST",
    headers: {
      "Content-Type": "application/x-www-form-urlencoded",
      Authorization: `Basic ${Buffer.from(`${creds.ci}:${creds.cs}`).toString("base64")}`,
    },
    body: `grant_type=password&username=${creds.saak}&password=${creds.sask}`,
  });
  const { access_token } = await tokenResp.json();

  const resp = await fetch(`${creds.iu}/lnapi/odata/tdapi.PurchaseOrders?$top=10`, {
    headers: { Authorization: `Bearer ${access_token}`, Accept: "application/json" },
  });
  console.log("Orders:", (await resp.json()).value);
}
getLnData().catch(console.error);

cURL: Refresh an expired token

# IMPORTANT: Store the NEW refresh_token from this response
curl -s -X POST "{token_endpoint}" \
  -u "{ClientID}:{ClientSecret}" \
  -d "grant_type=refresh_token&refresh_token={your_refresh_token}"

Data Mapping

API Response Format Differences

AspectM3 MIProgramLN ODataCSI IDO
Record structureMIRecord[].NameValue[] (name/value pairs)Standard OData entities (key/value JSON)IDO property collections
Field naming4-char codes (CUNO, CUNM, ITNO)Full names (CustomerNumber, ItemDescription).NET property names (CustomerNum)
Date formatYYYYMMDD as string ("20260302")ISO 8601 ("2026-03-02T00:00:00Z").NET DateTime
Null handlingEmpty string ""JSON nullJSON null or absent
Boolean"1"/"0" as stringtrue/falsetrue/false

Data Type Gotchas

Error Handling & Failure Points

Common Error Codes

CodeMeaningCauseResolution
401UnauthorizedToken expired (>2h) or revokedAcquire new token; check refresh token validity
403ForbiddenInsufficient permissionsCheck ION API app permissions and ERP user roles
404Not FoundWrong MIProgram, unpublished LN OData, or unregistered IDOVerify program/resource exists in API catalog
429Too Many RequestsION Gateway spike arrest triggeredExponential backoff; respect Retry-After header
500Internal Server ErrorBackend ERP application errorCheck response body for ERP error message
NOK (M3)Transaction rejectedM3 business validation failedParse MIRecord error message; check field values

Failure Points in Production

Anti-Patterns

Wrong: Treating M3 MIProgram REST like standard REST

# BAD -- M3 does not use POST/PUT/DELETE methods
requests.post(f"{base}/M3/m3api-rest/execute/CRS610MI/AddAddress",
              json={"CUNO": "Y30000", "ADRT": "1"})
# Returns 405 Method Not Allowed

Correct: Use GET with transaction names for all M3 operations

# GOOD -- M3 uses GET for everything; mutation is in the transaction name
requests.get(
    f"{base}/M3/m3api-rest/execute/CRS610MI/AddAddress"
    "?CONO=1&CUNO=Y30000&ADRT=1&CUA1=123+Main+St",
    headers={"Authorization": f"Bearer {token}"}
)

Wrong: Assuming all LN functions have REST APIs

# BAD -- calling an LN endpoint that hasn't been modeled
resp = requests.get(f"{base}/lnapi/odata/tdapi.CustomEntity")
# Returns 404 because the API was never published in ttadv2570m700

Correct: Verify API availability in REST API Modeler first

# GOOD -- check LN OData API catalog (session ttadv2570m700) before design
# Only use endpoints that appear in the published API list
resp = requests.get(
    f"{base}/lnapi/odata/tdapi.PurchaseOrders?$top=1",
    headers={"Authorization": f"Bearer {token}"}
)

Wrong: Using REST API for bulk data extraction

# BAD -- looping through 100K records via M3 MIProgram
while True:  # Takes hours, may hit throttle limits
    resp = requests.get(f"{base}/M3/m3api-rest/execute/MMS200MI/LstByNumber;maxrecs=1000")
    ...

Correct: Use Data Lake for bulk extraction

# GOOD -- Data Lake handles millions of records efficiently
resp = requests.get(
    f"{base}/DATAFABRIC/compass/v2/schemas/M3/tables/OCUSMA",
    headers={"Authorization": f"Bearer {token}"},
    params={"$filter": "OKCONO eq 1", "$top": 100000}
)

Common Pitfalls

Diagnostic Commands

# Test ION API Gateway authentication
curl -s -X POST "{token_endpoint}" \
  -u "{ClientID}:{ClientSecret}" \
  -d "grant_type=password&username={AccessKey}&password={SecretKey}" | jq .

# Test M3 API connectivity (list first 5 customers)
curl -s "{base}/M3/m3api-rest/execute/CRS610MI/LstByNumber;maxrecs=5?CONO=1" \
  -H "Authorization: Bearer {TOKEN}" -H "Accept: application/json" | jq .

# Test LN OData API connectivity
curl -s "{base}/lnapi/odata/tdapi.PurchaseOrders?$top=1" \
  -H "Authorization: Bearer {TOKEN}" -H "Accept: application/json" | jq .

# Check M3 API availability (WADL discovery)
curl -s "{base}/M3/m3api-rest/application.wadl" \
  -H "Authorization: Bearer {TOKEN}" | head -50

# Revoke token (cleanup)
curl -s -X POST "{base}/{tenant}/as/revoke_token.oauth2" \
  -u "{ClientID}:{ClientSecret}" \
  -d "token={TOKEN}&token_type_hint=access_token"

Version History & Compatibility

ChangeDateImpactMigration Notes
ION API Gateway mandatory for M3 CloudSuite2024Breaking (on-prem to cloud)Reroute all direct M3 API calls through ION Gateway with OAuth 2.0
LN REST API Modeler (ttadv2570m700)2023New featureEnables custom OData REST API creation for LN
Data Lake / Compass SQL API2022-2024New featurePreferred method for bulk data extraction
Unified ION API Gateway (Infor OS)2021-2022Architecture changeSingle gateway layer; unified OAuth 2.0
M3 BOD Processor replaces Media Management2023Migration requiredOutbound messages via Event Analytics + BOD Processor

When to Use / When Not to Use

Use WhenDon't Use WhenUse Instead
Comparing API surfaces across M3, LN, and CSI for architecture decisionsNeed deep-dive on single product's APIProduct-specific API capability card
Designing a multi-product Infor integrationNeed authentication setup instructionsbusiness/erp-integration/infor-ion-api-authentication/2026
Evaluating which CloudSuite product to integrate withNeed iPaaS/middleware comparisonbusiness/erp-integration/ipaas-infor-integration/2026
Understanding Infor's API landscape before cloud migrationNeed on-premise integration patternsOn-prem patterns differ; ION Gateway is cloud-only

Cross-System Comparison

CapabilityM3LNCSI (SyteLine)Notes
API StyleMIProgram REST (GET-only)OData v4 RESTIDO REST/SOAPLN most standards-compliant
Pre-built Coverage6,000+ transactionsMust model (ttadv2570m700)IDO-registered onlyM3 broadest out-of-the-box
HTTP MethodsGET onlyGET, POST, PATCH, DELETEGET, POST, PUT, DELETEM3 encodes mutations in txn names
Response FormatNameValue pair arraysStandard OData JSONIDO property collectionsM3 requires custom parsing
Query FilteringQuery string paramsOData $filter, $select, $expandIDO property filtersLN richest query language
Paginationmaxrecs matrix paramOData $top/$skip/nextLinkIDO-specificLN follows OData standard
Event-DrivenION BOD (Event Analytics)ION BOD (direct)ION BOD or IDO Request XMLAll share ION infrastructure
Bulk DataData Lake + CompassData Lake + CompassData Lake + CompassShared Infor OS capability
AuthenticationOAuth 2.0 (ION Gateway)OAuth 2.0 (ION Gateway)OAuth 2.0 (ION Gateway)Identical auth layer
Developer ToolingM3 API RepositoryREST API ModelerMongoose / IDO devM3 most mature tooling
SOAP SupportLimited / legacyFullFull (IDO SOAP)M3 is REST-first

Important Caveats

Related Units