Skip to content

Omnichannel Rail

The Omnichannel Rail provides APIs for managing customer journeys, delegation of authority, multi-channel approvals, activity timelines, and notification delivery across all channels.

The Omnichannel Rail unifies customer-facing and back-office interaction flows:

CapabilityDescription
Journey ManagementDefine, advance, and complete multi-step customer journeys
Journey TemplatesReusable journey templates with configurable steps
DelegationGrant and revoke authority delegation between users
ApprovalsMulti-party approval workflows with audit trail
TimelineUnified activity timeline per customer or entity
NotificationsMulti-channel notification delivery (push, email, SMS, in-app)
GET /api/v1/omni/journeys

Lists all customer journeys for the authenticated tenant.

Query Parameters:

ParameterTypeDescription
statusstringFilter by status (created, in_progress, assigned, completed, cancelled)
templateIdstringFilter by journey template ID
customerIdstringFilter by customer entity ID
assigneeIdstringFilter by assigned user ID
pagenumberPage number (default: 1)
perPagenumberItems per page (default: 20, max: 100)
POST /api/v1/omni/journeys

Creates a new customer journey from a template.

Request Body:

{
"templateId": "tmpl_onboarding_sme",
"customerId": "ent_customer_456",
"channel": "web",
"context": {
"productType": "murabaha",
"requestedAmount": { "amount": 2000000, "currency": "SAR" }
},
"assigneeId": "usr_rm_001",
"priority": "normal",
"dueAt": "2024-01-25T17:00:00Z"
}

Response:

{
"data": {
"id": "jrn_abc123",
"status": "created",
"templateId": "tmpl_onboarding_sme",
"customerId": "ent_customer_456",
"channel": "web",
"currentStepIndex": 0,
"currentStep": {
"id": "step_kyc",
"name": "KYC Verification",
"type": "kyc_check",
"status": "pending"
},
"totalSteps": 6,
"completedSteps": 0,
"assigneeId": "usr_rm_001",
"priority": "normal",
"dueAt": "2024-01-25T17:00:00Z",
"createdAt": "2024-01-15T10:30:00Z",
"updatedAt": "2024-01-15T10:30:00Z"
}
}
POST /api/v1/omni/journeys/{id}/advance

Advances a journey to the next step.

Request Body:

{
"completedStepId": "step_kyc",
"stepOutcome": "passed",
"stepData": {
"kycStatus": "verified",
"kycReference": "kyc_ref_001"
},
"advancedBy": "usr_rm_001"
}

Response:

{
"data": {
"id": "jrn_abc123",
"status": "in_progress",
"currentStepIndex": 1,
"currentStep": {
"id": "step_docs",
"name": "Document Collection",
"type": "document_upload",
"status": "pending"
},
"completedSteps": 1,
"updatedAt": "2024-01-15T11:00:00Z"
}
}
POST /api/v1/omni/journeys/{id}/assign

Assigns or reassigns a journey to a user or team.

Request Body:

{
"assigneeId": "usr_rm_002",
"assigneeType": "user",
"reason": "Original RM on leave",
"notifyAssignee": true
}
POST /api/v1/omni/journeys/{id}/complete

Marks a journey as successfully completed.

Request Body:

{
"completionNotes": "All steps completed, contract activated",
"completedBy": "usr_rm_001",
"outcome": "success"
}
POST /api/v1/omni/journeys/{id}/cancel

Cancels an in-progress journey.

Request Body:

{
"cancellationReason": "Customer withdrew application",
"cancelledBy": "usr_rm_001"
}
GET /api/v1/omni/templates

Lists all journey templates available to the tenant.

Query Parameters:

ParameterTypeDescription
categorystringFilter by category (onboarding, servicing, sales)
statusstringFilter by status (active, draft, archived)
POST /api/v1/omni/templates

Creates a new journey template.

Request Body:

{
"name": "SME Onboarding",
"description": "End-to-end onboarding journey for SME customers",
"category": "onboarding",
"steps": [
{
"id": "step_kyc",
"name": "KYC Verification",
"type": "kyc_check",
"order": 1,
"required": true,
"timeoutHours": 48
},
{
"id": "step_docs",
"name": "Document Collection",
"type": "document_upload",
"order": 2,
"required": true,
"documentsRequired": ["trade_license", "financial_statements"]
},
{
"id": "step_credit",
"name": "Credit Assessment",
"type": "approval",
"order": 3,
"required": true,
"approvalRoleRequired": "credit_analyst"
}
],
"estimatedDurationDays": 5,
"slaHours": 120
}
GET /api/v1/omni/delegations

Lists all active and historical authority delegations.

Query Parameters:

ParameterTypeDescription
delegatorIdstringFilter by delegating user ID
delegateeIdstringFilter by delegated-to user ID
statusstringFilter by status (active, expired, revoked)
scopestringFilter by delegation scope (approvals, journeys, all)
POST /api/v1/omni/delegations

Grants a delegation of authority from one user to another.

Request Body:

{
"delegatorId": "usr_manager_001",
"delegateeId": "usr_deputy_002",
"scope": ["approvals", "journey_assign"],
"maxApprovalAmount": { "amount": 500000, "currency": "SAR" },
"validFrom": "2024-01-15T00:00:00Z",
"validTo": "2024-01-22T23:59:59Z",
"reason": "Annual leave coverage"
}

Response:

{
"data": {
"id": "del_xyz789",
"status": "active",
"delegatorId": "usr_manager_001",
"delegateeId": "usr_deputy_002",
"scope": ["approvals", "journey_assign"],
"maxApprovalAmount": { "amount": 500000, "currency": "SAR" },
"validFrom": "2024-01-15T00:00:00Z",
"validTo": "2024-01-22T23:59:59Z",
"createdAt": "2024-01-15T09:00:00Z"
}
}
GET /api/v1/omni/approvals

Lists all approval requests.

Query Parameters:

ParameterTypeDescription
statusstringFilter by status (requested, approved, rejected, expired)
approverIdstringFilter by approver user ID
requesterIdstringFilter by requester user ID
entityTypestringFilter by entity type (journey, contract, payment)
POST /api/v1/omni/approvals

Creates an approval request.

Request Body:

{
"entityType": "journey",
"entityId": "jrn_abc123",
"approvalType": "credit_committee",
"requestedBy": "usr_rm_001",
"approvers": [
{ "userId": "usr_credit_001", "role": "primary", "required": true },
{ "userId": "usr_credit_002", "role": "secondary", "required": false }
],
"approvalData": {
"facilityAmount": { "amount": 2000000, "currency": "SAR" },
"creditScore": 720,
"recommendation": "approve"
},
"expiresAt": "2024-01-18T17:00:00Z"
}
GET /api/v1/omni/timeline

Retrieves a unified activity timeline across journeys, approvals, and notifications for an entity.

Query Parameters:

ParameterTypeDescription
entityIdstringEntity ID (customer, journey, contract) - required
entityTypestringEntity type (customer, journey, contract) - required
fromDatestringFilter from date (ISO 8601)
toDatestringFilter to date (ISO 8601)
eventTypesstringComma-separated event type filters
pagenumberPage number (default: 1)
perPagenumberItems per page (default: 50, max: 200)

Response:

{
"data": [
{
"id": "evt_001",
"timestamp": "2024-01-15T10:30:00Z",
"eventType": "journey.created",
"actorId": "usr_rm_001",
"actorName": "Ahmed Al-Rashidi",
"channel": "web",
"summary": "Onboarding journey created",
"metadata": {
"journeyId": "jrn_abc123",
"templateId": "tmpl_onboarding_sme"
}
},
{
"id": "evt_002",
"timestamp": "2024-01-15T11:00:00Z",
"eventType": "journey.advanced",
"actorId": "usr_rm_001",
"summary": "Journey advanced: KYC step completed",
"metadata": { "stepId": "step_kyc", "outcome": "passed" }
}
],
"pagination": { "page": 1, "perPage": 50, "total": 2 }
}
GET /api/v1/omni/notifications

Lists all notifications for the tenant or a specific recipient.

Query Parameters:

ParameterTypeDescription
recipientIdstringFilter by recipient user or customer ID
channelstringFilter by channel (push, email, sms, in_app)
statusstringFilter by status (pending, sent, delivered, failed)
readbooleanFilter by read status
POST /api/v1/omni/notifications

Sends a notification through one or more channels.

Request Body:

{
"recipientId": "ent_customer_456",
"recipientType": "customer",
"channels": ["push", "email"],
"templateCode": "JOURNEY_STEP_REQUIRED",
"templateData": {
"journeyName": "SME Onboarding",
"stepName": "Document Collection",
"dueDate": "2024-01-17"
},
"priority": "normal",
"scheduleAt": null
}
stateDiagram-v2
direction LR
[*] --> Created: Create Journey
Created --> InProgress: Advance First Step
InProgress --> Assigned: Assign to User
Assigned --> InProgress: Resume
InProgress --> Completed: All Steps Done
InProgress --> Cancelled: Cancel
Created --> Cancelled: Cancel
classDef created fill:#1565c0,color:#fff,stroke:#1565c0
classDef inprogress fill:#e65100,color:#fff,stroke:#e65100
classDef assigned fill:#2e7d32,color:#fff,stroke:#2e7d32
classDef completed fill:#1a5f4a,color:#fff,stroke:#1a5f4a
classDef cancelled fill:#c62828,color:#fff,stroke:#c62828
class Created created
class InProgress inprogress
class Assigned assigned
class Completed completed
class Cancelled cancelled
StatusDescription
createdJourney created, not yet started
in_progressOne or more steps completed, journey active
assignedJourney assigned to a specific user
completedAll required steps completed successfully
cancelledJourney cancelled before completion
StatusDescription
requestedApproval request raised, pending action
approvedAll required approvers have approved
rejectedOne or more required approvers rejected
expiredApproval not actioned before expiry deadline

The Omnichannel Rail emits the following webhook events:

EventDescription
omni.journey.createdNew journey created
omni.journey.advancedJourney advanced to next step
omni.journey.assignedJourney assigned to a user or team
omni.journey.completedJourney completed successfully
omni.journey.cancelledJourney cancelled
omni.approval.requestedApproval request raised
omni.approval.approvedApproval granted
omni.approval.rejectedApproval rejected
omni.delegation.grantedAuthority delegation created and active
omni.delegation.revokedAuthority delegation revoked
import { IOFClient } from "@iof/sdk";
const client = new IOFClient({ apiKey: process.env.IOF_API_KEY });
// Create an onboarding journey for a customer
const journey = await client.omni.journeys.create({
templateId: "tmpl_onboarding_sme",
customerId: "ent_customer_456",
channel: "web",
context: {
productType: "murabaha",
requestedAmount: { amount: 2000000, currency: "SAR" },
},
assigneeId: "usr_rm_001",
});
// Advance through steps
await client.omni.journeys.advance(journey.id, {
completedStepId: "step_kyc",
stepOutcome: "passed",
stepData: { kycStatus: "verified" },
advancedBy: "usr_rm_001",
});
// Create an approval request for the journey
const approval = await client.omni.approvals.create({
entityType: "journey",
entityId: journey.id,
approvalType: "credit_committee",
requestedBy: "usr_rm_001",
approvers: [{ userId: "usr_credit_001", role: "primary", required: true }],
expiresAt: "2024-01-18T17:00:00Z",
});
// Get the full customer timeline
const timeline = await client.omni.timeline.get({
entityId: "ent_customer_456",
entityType: "customer",
perPage: 50,
});
from iof import IOFClient
client = IOFClient(api_key=os.environ["IOF_API_KEY"])
# Create and advance journey
journey = client.omni.journeys.create(
template_id="tmpl_onboarding_sme",
customer_id="ent_customer_456",
channel="web",
assignee_id="usr_rm_001",
)
client.omni.journeys.advance(
journey.id,
completed_step_id="step_kyc",
step_outcome="passed",
advanced_by="usr_rm_001",
)
# Grant a delegation
client.omni.delegations.create(
delegator_id="usr_manager_001",
delegatee_id="usr_deputy_002",
scope=["approvals", "journey_assign"],
valid_from="2024-01-15T00:00:00Z",
valid_to="2024-01-22T23:59:59Z",
)
# Send a notification
client.omni.notifications.create(
recipient_id="ent_customer_456",
channels=["push", "email"],
template_code="JOURNEY_STEP_REQUIRED",
template_data={"step_name": "Document Collection"},
)