IFS Aurena Extensibility: Custom Pages, Projections, and Integration Guide

Type: ERP Integration System: IFS Cloud (Aurena) 24R2 Confidence: 0.84 Sources: 8 Verified: 2026-03-03 Freshness: 2026-03-03

TL;DR

System Profile

IFS Cloud is a cloud-native ERP platform built on a component-based architecture. The Aurena client is the modern web-based UI (replacing the legacy Enterprise Explorer / Java-based client), built using a declarative domain-specific language called Marble. Aurena uses a clear separation between the client layer (UI definition in .client files) and the projection layer (data/API definition in .projection files). The underlying architecture generates two deployable packages from these models: the _CPI package (client page definition) and the _SVC package (projection/service logic). The projection services are exposed as OData v4 endpoints, making every Aurena projection inherently a REST API. [src1, src3]

PropertyValue
VendorIFS
SystemIFS Cloud 24R2 (Aurena client)
API SurfaceOData v4 (Projections as REST endpoints)
Current API Version24R2 (November 2024 release)
Editions CoveredAll IFS Cloud editions
DeploymentCloud (SaaS) / Managed Cloud
API DocsIFS Technical Documentation - Extensibility
StatusGA

API Surfaces & Capabilities

IFS Aurena extensibility spans both UI customization and API integration. Every projection defined in Marble is automatically exposed as an OData v4 service endpoint, which means UI extensibility and API extensibility are the same thing. [src1, src4]

API SurfaceProtocolBest ForMax Records/RequestRate LimitReal-time?Bulk?
OData v4 Projections (Main)HTTPS/JSON ODataAurena pages + external OAuth integrationsConfigurable via $topServer-managedYesPaged
OData v4 Projections (Integration)HTTPS/JSON ODataMiddleware / iPaaS integrations (Basic Auth)Configurable via $topServer-managedYesPaged
Custom ProjectionsHTTPS/JSON ODataNew business entities, custom logicSame as standardShared poolYesPaged
Projection ActionsHTTPS/JSON POSTBusiness operations (approve, release)N/A (action-based)SharedYesN/A
Push Notifications / Business EventsHTTP callbacksReal-time outbound event detectionN/AN/AYesN/A
IFS REST Task (Workflows)HTTPS/JSONCalling external REST APIs from IFS workflowsN/APer-workflowYesN/A

Rate Limits & Quotas

IFS Cloud does not publish hard numeric API rate limits. Rate management is handled at the infrastructure level through server-side throttling, connection pooling, and tenant isolation.

Per-Request Limits

Limit TypeValueApplies ToNotes
Max records per query pageConfigurable via $topAll OData projectionsDefault page size varies by projection; use $top and $skip for pagination [src4]
Max $expand depthLimited (implementation-dependent)OData queriesDeep nesting may hit server limits or timeout
Max request body sizeServer-configured (typically 10-50 MB)POST/PUT operationsDepends on IFS Cloud deployment configuration
Concurrent OData connectionsDeployment-dependentPer tenantManaged by IFS Cloud infrastructure

Rolling / Daily Limits

Limit TypeValueWindowEdition Differences
API request throughputServer-managed (no published hard limit)ContinuousInfrastructure-level throttling [src5]
Concurrent user sessionsLicense-dependentPer deploymentCheck IFS licensing terms
Workflow REST Task callsPer-workflow frequency limitsPer executionConfigurable in workflow designer; new in 24R1 [src8]
Integration projection sessionsDeployment-dependentPer tenantSeparate connection pooling on /int/ path

Authentication

IFS Cloud uses IFS IAM (Identity and Access Manager) as its OAuth 2.0 authorization server. The authentication method depends on whether you access projections through the Main application path or the Integration path. [src5, src6]

FlowUse WhenToken LifetimeRefresh?Notes
OAuth 2.0 / OpenID ConnectAll Aurena /main/ projectionsConfigurable in IFS IAMYesRequired for standard Aurena projections [src5]
Basic Auth (Integration category)Middleware / iPaaS via /int/ pathSession-basedNoOnly for Integration-category projections [src5]
Client Credentials (OAuth 2.0)Server-to-server automationConfigurableYesRegister application in IFS IAM [src6]
Authorization Code (OAuth 2.0)User-context interactive appsConfigurableYesRedirect-based flow [src6]

Authentication Gotchas

Constraints

Integration Pattern Decision Tree

START -- User needs to extend or integrate with IFS Cloud (Aurena)
|-- What type of extensibility?
|   |-- UI Customization (change existing pages)
|   |   |-- Add fields? --> @Override in .client-Cust + .projection-Cust [src2]
|   |   |-- Change behavior (commands)? --> @Overtake in .client-Cust [src2]
|   |   |-- New page? --> New .client + .projection + .plsvc in Cust layer [src2]
|   |-- API / Data Integration (external systems)
|   |   |-- Read data? --> Expose projection via API Explorer as OData [src4]
|   |   |-- Write data? --> POST/PUT to projection OData endpoint [src4]
|   |   |-- Business action? --> POST to projection action endpoint [src4]
|   |   |-- Auth: OAuth capable? --> /main/ path [src5]
|   |   |-- Auth: Basic Auth only? --> Set to Integration, /int/ path [src5]
|   |-- Dashboard / Lobby
|   |   |-- Design in Enterprise Explorer [src1]
|   |   |-- Auto-appears in Aurena after configuration
|   |-- Workflow Integration (24R1+)
|       |-- Call external API? --> IFS REST Task [src8]
|       |-- Event-driven outbound? --> Business Events
|-- Customization layer?
|   |-- Cust layer (-Cust suffix) --> Customer changes [src2, src7]
|   |-- Ext layer (-Ext suffix) --> ISV/partner extensions [src3]
|   |-- Base layer --> Never modify [src7]
|-- Deploy as IFS Cloud component, test in sandbox first [src3]

Quick Reference

OperationMethodEndpoint PatternPayloadNotes
Query recordsGET/main/ifsapplications/projection/v1/{Projection}.svc/{EntitySet}N/AOData v4: $filter, $select, $expand, $top, $skip [src4]
Get single recordGET/main/.../v1/{Projection}.svc/{EntitySet}(keys)N/AKey fields in parentheses
Create recordPOST/main/.../v1/{Projection}.svc/{EntitySet}JSONStandard OData POST
Update recordPATCH/main/.../v1/{Projection}.svc/{EntitySet}(keys)JSONPartial update via PATCH
Delete recordDELETE/main/.../v1/{Projection}.svc/{EntitySet}(keys)N/ANot all entities support delete
Execute actionPOST/main/.../v1/{Projection}.svc/{ActionName}JSON paramsActions defined in projection
Integration pathGET/POST/int/ifsapplications/projection/v1/{Projection}.svc/{EntitySet}JSON/N/AIntegration-category only [src5]
API ExplorerBrowserSolution Manager > Integration > API ExplorerN/ABrowse projections, enable for integration
Page registrationN/ASolution Manager > NavigatorN/ARegister custom .client pages

Step-by-Step Integration Guide

1. Explore available projections in API Explorer

Navigate to Solution Manager > Integration > API Explorer. Browse or search for projections, view entity sets, actions, and functions. Enable for Integration to allow Basic Auth access. [src4]

Verify: Projection appears in API Explorer with entity sets listed.

2. Authenticate and obtain OAuth access token

Register your application in IFS IAM. For server-to-server, use client credentials flow. [src5, src6]

# Discover OAuth endpoints
curl -s "https://yourinstance.ifs.cloud/.well-known/openid-configuration" | python3 -m json.tool

# Obtain token using client credentials flow
curl -X POST "https://yourinstance.ifs.cloud/auth/realms/ifs/protocol/openid-connect/token" \
  -H "Content-Type: application/x-www-form-urlencoded" \
  -d "grant_type=client_credentials" \
  -d "client_id=YOUR_CLIENT_ID" \
  -d "client_secret=YOUR_CLIENT_SECRET" \
  -d "scope=openid"

Verify: Response contains an access_token field.

3. Query data via OData projection endpoint

Use standard OData v4 query syntax against the projection endpoint. [src4]

# Query with OAuth
curl -X GET "https://yourinstance.ifs.cloud/main/ifsapplications/projection/v1/CustomerOrderHandling.svc/CustomerOrderSet?\$filter=State eq 'Planned'&\$top=50" \
  -H "Authorization: Bearer $TOKEN" \
  -H "Accept: application/json"

# Query with Basic Auth (Integration path)
curl -X GET "https://yourinstance.ifs.cloud/int/ifsapplications/projection/v1/CustomerOrderHandling.svc/CustomerOrderSet?\$top=10" \
  -u "username:password" \
  -H "Accept: application/json"

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

4. Create a custom projection in Cust layer

When existing projections do not expose the data shape you need, create a custom projection using IFS Developer Studio in the Cust layer. [src1, src2]

-- File: YourComponent-Cust.projection (Marble DSL)
projection MyCustomIntegrationHandling;
component YourComponent;
layer Cust;
description "Custom projection for external integration";

entityset MyCustomEntitySet for MyCustomEntity;

@Override
entity MyCustomEntity {
   attribute OrderNo Text;
   attribute CustomerNo Text;
   attribute TotalAmount Number;
   attribute Status Enumeration(CustomerOrderState);
}

action ApproveOrder {
   initialcheck none;
   parameter OrderNo Text;
}

Verify: After deploying, the projection appears in API Explorer.

5. Extend an existing Aurena page with custom fields

Use @Override in a Cust-layer .client file. [src2]

-- File: CustomerOrderHandling-Cust.client (Marble DSL)
client CustomerOrderHandlingCust;
component ORDER;
layer Cust;

@Override
page CustomerOrderForm using CustomerOrderSet {
   group CustomFieldsGroup after GeneralGroup {
      label = "Custom Fields";
      field MyCustomField {
         label = "Custom Reference";
         size = Medium;
      }
   }
}

Verify: The custom field group appears on the Customer Order page in Aurena.

6. Implement error handling for OData integration

Parse OData error responses and implement retry logic. [src4, src5]

import requests, time

def ifs_odata_request(instance_url, token, projection, entity_set,
                      params=None, max_retries=3):
    url = (f"{instance_url}/main/ifsapplications/projection/v1/"
           f"{projection}.svc/{entity_set}")
    headers = {"Authorization": f"Bearer {token}",
               "Accept": "application/json"}

    for attempt in range(max_retries):
        resp = requests.get(url, headers=headers, params=params, timeout=30)
        if resp.status_code == 200:
            return resp.json().get("value", [])
        if resp.status_code == 401:
            raise Exception("Token expired or invalid")
        if resp.status_code == 403:
            raise Exception("Valid token but insufficient projection access")
        if resp.status_code in (500, 502, 503):
            time.sleep(min(2 ** attempt * 2, 30))
            continue
        raise Exception(f"OData error {resp.status_code}: {resp.text[:500]}")
    raise Exception("Max retries exceeded")

Verify: Test with an invalid projection name to confirm error parsing.

Code Examples

Python: Query and paginate IFS Cloud OData projection

# Input:  IFS Cloud instance URL, OAuth token
# Output: All customer orders matching filter across all pages

import requests

def get_all_orders(instance_url, token, state="Planned", page_size=100):
    headers = {"Authorization": f"Bearer {token}", "Accept": "application/json"}
    all_orders, skip = [], 0
    while True:
        url = (f"{instance_url}/main/ifsapplications/projection/v1/"
               f"CustomerOrderHandling.svc/CustomerOrderSet"
               f"?$filter=State eq '{state}'&$top={page_size}&$skip={skip}")
        resp = requests.get(url, headers=headers, timeout=30)
        resp.raise_for_status()
        records = resp.json().get("value", [])
        if not records:
            break
        all_orders.extend(records)
        if len(records) < page_size:
            break
        skip += page_size
    return all_orders

JavaScript/Node.js: Create a record via OData POST

// Input:  IFS Cloud instance URL, OAuth token, order data
// Output: Created record or error
// npm install [email protected]
const axios = require("axios");

async function createOrder(instanceUrl, token, orderData) {
  const url = `${instanceUrl}/main/ifsapplications/projection/v1/CustomerOrderHandling.svc/CustomerOrderSet`;
  try {
    const resp = await axios.post(url, orderData, {
      headers: { Authorization: `Bearer ${token}`, "Content-Type": "application/json" },
    });
    console.log("Order created:", resp.data.OrderNo);
    return resp.data;
  } catch (err) {
    if (err.response?.status === 403) console.error("Check IFS permission sets");
    throw err;
  }
}

cURL: Quick OData connectivity test

# Test OAuth (Main path)
curl -s "https://yourinstance.ifs.cloud/main/ifsapplications/projection/v1/CustomerHandling.svc/CustomerSet?\$top=5" \
  -H "Authorization: Bearer $TOKEN" -H "Accept: application/json" | python3 -m json.tool

# Test Basic Auth (Integration path)
curl -s "https://yourinstance.ifs.cloud/int/ifsapplications/projection/v1/CustomerHandling.svc/CustomerSet?\$top=5" \
  -u "user:pass" -H "Accept: application/json" | python3 -m json.tool

# OData metadata
curl -s "https://yourinstance.ifs.cloud/main/ifsapplications/projection/v1/CustomerHandling.svc/\$metadata" \
  -H "Authorization: Bearer $TOKEN" -H "Accept: application/xml"

Data Mapping

Field Mapping Reference

IFS Aurena FieldOData RepresentationTypeTransformGotcha
Standard attributeDirect JSON propertyString/Number/DateNoneField names case-sensitive, match Marble attribute names [src4]
Enumeration fieldsString valueStringDisplay value in ODataFilter by display value, not internal enum code [src4]
Reference fields (LOV)String (key value)StringKey only, not descriptionUse $expand for descriptions
Date fieldsISO 8601 stringDateTimeOffsetYYYY-MM-DDTHH:MM:SSZTime zone depends on instance config
Computed/virtual fieldsRead-only JSON propertyVariesDefined by fetch attributeCannot be updated via API [src1]
Custom fields (Cust layer)Same as standardVariesAuto-exposed if in projectionMust be in .projection-Cust to appear in OData [src2]

Data Type Gotchas

Error Handling & Failure Points

Common Error Codes

CodeMeaningCauseResolution
400Validation errorInvalid field value, missing required field, or malformed OData queryParse OData error body for field-level details [src4]
401Authentication failureExpired OAuth token, invalid credentialsRe-authenticate; for /main/ use OAuth, for /int/ use Basic Auth [src5]
403Insufficient permissionsValid token, user lacks projection accessCheck IFS permission sets [src5, src6]
404Not foundWrong projection name, entity set name, or record keyVerify names in API Explorer; case-sensitive
500Server-side failurePL/SQL error in projection logic or DB constraintCheck IFS Cloud application server logs
502/503Service unavailableDeployment in progress or overloadRetry with exponential backoff

Failure Points in Production

Anti-Patterns

Wrong: Modifying base layer files directly

-- BAD -- base layer modification will be overwritten on upgrade
-- File: CustomerOrderHandling.client (base layer)
client CustomerOrderHandling;
component ORDER;
layer Core;
page CustomerOrderForm using CustomerOrderSet {
   field MyCustomField;  -- Lost on next IFS upgrade
}

Correct: Use Cust layer with @Override

-- GOOD -- Cust layer survives upgrades
-- File: CustomerOrderHandling-Cust.client
client CustomerOrderHandlingCust;
component ORDER;
layer Cust;

@Override
page CustomerOrderForm using CustomerOrderSet {
   field MyCustomField after ExistingField {
      label = "Custom Reference";
   }
}

Wrong: Using @Override on commands

-- BAD -- commands are atomic, @Override fails
@Override
command ApproveOrderCommand {
   label = "Custom Approve";  -- Deployment error
}

Correct: Use @Overtake to replace commands entirely

-- GOOD -- @Overtake replaces entire command
@Overtake
command ApproveOrderCommand {
   label = "Custom Approve";
   enabled = [Status = "Planned"];
   execute {
      call ApproveOrder(OrderNo);
      refresh;
      success("Order approved successfully");
   }
}

Wrong: Using Basic Auth on /main/ path

# BAD -- Basic Auth rejected on /main/ path
url = "https://instance.ifs.cloud/main/.../CustomerHandling.svc/CustomerSet"
response = requests.get(url, auth=("user", "pass"))  # 401

Correct: Use /int/ path for Basic Auth

# GOOD -- /int/ path accepts Basic Auth for Integration-category projections
url = "https://instance.ifs.cloud/int/.../CustomerHandling.svc/CustomerSet"
response = requests.get(url, auth=("integration_user", "password"))

Common Pitfalls

Diagnostic Commands

# Test OAuth token
curl -s "https://yourinstance.ifs.cloud/main/ifsapplications/projection/v1/" \
  -H "Authorization: Bearer $TOKEN" -H "Accept: application/json"

# Get OData metadata for a projection
curl -s "https://yourinstance.ifs.cloud/main/ifsapplications/projection/v1/CustomerHandling.svc/\$metadata" \
  -H "Authorization: Bearer $TOKEN" -H "Accept: application/xml" | head -50

# Test Basic Auth on Integration path
curl -s "https://yourinstance.ifs.cloud/int/ifsapplications/projection/v1/CustomerHandling.svc/CustomerSet?\$top=1" \
  -u "integration_user:password" -H "Accept: application/json"

# Discover OpenID Connect configuration
curl -s "https://yourinstance.ifs.cloud/.well-known/openid-configuration" | python3 -m json.tool

# Verify projection entity schema
curl -s "https://yourinstance.ifs.cloud/main/ifsapplications/projection/v1/CustomerOrderHandling.svc/\$metadata" \
  -H "Authorization: Bearer $TOKEN"

Version History & Compatibility

IFS Cloud VersionRelease DateStatusKey Extensibility ChangesMigration Notes
24R22024-11CurrentEnhanced OAuth in IFS REST Task; externalized URL configurationAudit workflow REST tasks for new OAuth options [src8]
24R12024-05SupportedExternal REST API calls from workflows (IFS REST Task)New capability, no breaking changes [src8]
23R22023-11SupportedSolution Manager enhancements; improved API ExplorerN/A
23R12023-05SupportedCustom Projection assistant in Solution ManagerLow-code projection creation
22R22022-11LegacyProjection-level security enhancementsConsider upgrading
22R12022-05EOLBaseline for current extensibility modelMinimum version for full support

When to Use / When Not to Use

Use WhenDon't Use WhenUse Instead
Extending IFS Aurena pages with custom fields, groups, or commandsBuilding separate web apps that read IFS dataDirect OData API integration
Creating custom projections for OData APIsNeeding hard numeric rate limits and SLA-guaranteed throughputIFS Connect or middleware with rate management
Configuring lobby dashboards with KPIsNeeding real-time streaming / CDCIFS Business Events + external event processing
Non-intrusive customizations surviving upgradesModifying core IFS PL/SQL base packagesIFS Developer Studio extension layer with partnership
Middleware integration via Basic Auth on /int/ pathComplex multi-step orchestration across systemsiPaaS (MuleSoft, Boomi) with IFS OData connector

Important Caveats

Related Units