Akrion One Developer Docs

Everything you need to integrate autonomous AI banking assistants into your digital channels.

Overview

Akrion One is a multi-tenant autonomous AI assistant platform designed for APRA-regulated mid-tier Australian financial institutions. It provides specialist AI agents that handle customer queries, loan processing, and proactive notifications — all with strict tenant isolation and compliance controls.

ℹ️ Architecture Principle

Akrion One uses a Pull + Push data integration model. Agents pull transactional data in real-time from your core banking API and push tenant knowledge (products, fees, policies) for RAG indexing. No transactional data is stored — queried and discarded after response generation.

Key Concepts

ConceptDescription
TenantA bank or credit union onboarded to the platform. Each tenant has isolated data, branding, and agent configuration.
AgentA specialist AI module (e.g. Account Query, Loan Processing) with defined tools, guardrails, and a security boundary.
OrchestratorRoutes customer messages to the appropriate specialist agent based on intent classification.
Knowledge BaseTenant-specific documents (fee schedules, policies, FAQs) indexed in Azure AI Search for RAG retrieval.
Core Banking AdapterAbstraction layer for connecting to a bank's core banking system (OpenTransact / Temenos-compatible API).

Quick Start

Get the Akrion One chat widget running on your test environment in three steps:

1

Get your Tenant ID and API Key

Contact the Akrion One team to provision your tenant. You'll receive a tenant_id and an API key for authentication.

2

Add the Widget Script

Add the Akrion One widget script to your web application's HTML:

HTML<!-- Akrion One Chat Widget -->
<script
  src="https://cdn.akrion.one/widget/v1/akrion-widget.js"
  data-tenant-id="YOUR_TENANT_ID"
  data-api-key="YOUR_API_KEY"
  data-position="bottom-right"
  data-theme="auto"
></script>
3

Configure Branding

Customise the widget appearance through the tenant configuration API or the admin dashboard:

JSON{
  "tenant_id": "coastal",
  "branding": {
    "primary_color": "#0891b2",
    "logo_url": "https://coastalcu.akrion.one/logo.svg",
    "welcome_message": "G'day! How can I help you today?",
    "agent_name": "Coastal Assistant"
  }
}

Architecture

Akrion One follows a PaaS-first, event-driven architecture on Microsoft Azure:

LayerServicePurpose
ComputeAzure Container AppsContainerised agents with Dapr sidecar
AI GatewayAzure API ManagementJWT validation, rate limiting, per-tenant usage analytics
AIMicrosoft Foundry v2GPT-5.1 reasoning, text-embedding-3-large for RAG
SearchAzure AI SearchPer-tenant knowledge index (knowledge-{tenant_id})
DataCosmos DB + PostgreSQLHigh-scale session store + relational metadata
MessagingService Bus + Event GridAgent-to-agent comms, system events
IdentityMicrosoft Entra IDManaged identities, tenant isolation via app registrations
SecurityKey Vault + DefenderSecrets management, runtime threat protection
ObservabilityAzure Monitor + App InsightsKQL dashboards, per-tenant metrics, correlation IDs
⚠️ Data Sovereignty

All data is processed and stored exclusively in Australia East (Sydney) and Australia Southeast (Melbourne) to meet APRA CPS 234 data residency requirements.

Chat Widget Integration (JS — Phase 1)

The Akrion One JS chat widget embeds directly into your existing web or mobile banking interface. It provides a fully branded AI assistant experience with minimal integration effort — a single <script> tag.

ℹ️ Integration Methods Overview

Akrion One offers three front-end integration methods, rolled out in phases:

  • Phase 1 — JS Widget (this section): IIFE script tag. Quickest to deploy; zero learning curve. Best for static sites and POCs.
  • Phase 1.5 — Web Component (<akrion-chat>): HTML Custom Element with Shadow DOM isolation. Recommended for production banking portals and SPAs.
  • Phase 2 — React Component: Thin wrapper around the Web Component for React codebases.

All three share the same REST/WebSocket backend — you can migrate incrementally without backend changes.

Script Tag (Simplest)

Drop a single script tag into your HTML. The widget auto-initialises with your tenant configuration:

HTML<!-- Place before </body> -->
<script
  src="https://cdn.akrion.one/widget/v1/akrion-widget.js"
  data-tenant-id="acme"
  data-api-key="ak_live_xxxxxxxxxxxx"
  data-position="bottom-right"
  data-theme="auto"
  data-lang="en-AU"
></script>

JavaScript SDK (Advanced)

For more control, use the JavaScript SDK to programmatically initialise and control the widget:

JavaScriptimport { AkrionWidget } from '@akrion-one/widget';

const widget = new AkrionWidget({
  tenantId: 'acme',
  apiKey: 'ak_live_xxxxxxxxxxxx',
  position: 'bottom-right',
  theme: 'dark',
  language: 'en-AU',
  customerContext: {
    customerId: 'CUST-001',
    segment: 'premium',
    authenticated: true
  },
  onReady: () => console.log('Akrion widget ready'),
  onMessage: (msg) => console.log('Agent response:', msg),
  onEscalation: (ticket) => {
    // Handle escalation — e.g., open your CRM
    console.log('Escalation raised:', ticket.id);
  }
});

// Programmatic control
widget.open();
widget.sendMessage('What is my account balance?');
widget.close();

React Component

React / TypeScriptimport { AkrionChat } from '@akrion-one/react';

export default function BankingApp() {
  return (
    <div className="app">
      {/* Your banking app content */}
      <AkrionChat
        tenantId="coastal"
        apiKey={process.env.REACT_APP_AKRION_KEY}
        position="bottom-right"
        theme="auto"
        welcomeMessage="G'day! How can I help you today?"
        onEscalation={(ticket) => {
          // Route to your escalation handler
          handleEscalation(ticket);
        }}
      />
    </div>
  );
}

Configuration Options

OptionTypeDefaultDescription
tenantIdstringYour Akrion One tenant identifier (required)
apiKeystringAPI key for authentication (required)
positionstringbottom-rightbottom-right or bottom-left
themestringautolight, dark, or auto (follows OS preference)
languagestringen-AULocale code for agent responses
welcomeMessagestringCustom greeting shown when widget opens
customerContextobjectPre-authenticated customer context (ID, segment)

Web Component (<akrion-chat> — Phase 1.5)

The <akrion-chat> Web Component is the recommended integration for production banking portals, single-page apps, and any site with its own design system. It ships as a native HTML Custom Element with Shadow DOM encapsulation — the bank's CSS cannot break the widget, and the widget's CSS cannot affect the bank's page.

✅ Why Web Component over JS Widget?
  • True CSS isolation via Shadow DOM — no z-index wars or selector collisions
  • Lifecycle hooks (connectedCallback / disconnectedCallback) — proper cleanup in SPAs
  • Reactive attributes — change tenant-id at runtime and the component re-initialises
  • Multiple instances per page — e.g., separate chats for accounts and loans
  • CSS Custom Properties + ::part() — theming that integrates with your design tokens
  • Slots for content projection — inject custom footer, welcome message, or branding
  • Framework-agnostic — first-class HTML element that works in React, Vue, Angular, Svelte, or vanilla

Quick Start

Load the ES module and drop the custom element into your page:

HTML<!-- Load the component definition -->
<script
  type="module"
  src="https://cdn.akrion.one/widget/v1.5/akrion-chat.js"
></script>

<!-- Place anywhere in your page -->
<akrion-chat
  tenant-id="coastal"
  api-url="https://akrion-apim.azure-api.net"
  position="bottom-right"
  theme="auto"
  locale="en-AU"
></akrion-chat>

Observed Attributes

All configuration is declarative via HTML attributes. Changes are applied reactively at runtime.

AttributeTypeDefaultDescription
tenant-idstringYour Akrion One tenant identifier (required)
api-urlstringAPIM endpoint for your tenant (required)
positionstringbottom-rightbottom-right or bottom-left
themestringautolight, dark, or auto
customer-idstringAuthenticated customer context — triggers personalised greeting
greetingstringCustom welcome message shown when panel opens
primary-colorstring#0891b2Primary brand colour (hex)
logostringURL to tenant logo shown in header
localestringen-AULanguage/region code for agent responses

Event API (Custom Events)

The component emits CustomEvents that cross the Shadow DOM boundary (bubbles: true, composed: true). Listen to them on the element or any ancestor:

JavaScriptconst chat = document.querySelector('akrion-chat');

// Fired once the component has loaded tenant branding and is ready
chat.addEventListener('akrion:ready', () => {
  console.log('Akrion widget ready');
});

// Fired when the agent sends a message
chat.addEventListener('akrion:message', (e) => {
  console.log('Agent:', e.detail.text, 'from', e.detail.agent);
  analytics.track('ai_response', { agent: e.detail.agent });
});

// Fired when the agent escalates to a human
chat.addEventListener('akrion:escalation', (e) => {
  openSupportTicket({
    reason: e.detail.reason,
    priority: e.detail.priority
  });
});

// Fired on unrecoverable errors (network, backend, etc.)
chat.addEventListener('akrion:error', (e) => {
  errorReporting.log(e.detail);
});
EventDetail PayloadWhen Fired
akrion:ready{}Component connected and tenant config loaded
akrion:message{ text, agent, conversationId }Agent sends a response
akrion:escalation{ reason, priority, ticketId }Conversation escalated to a human
akrion:error{ code, message }Network or backend error

Theming with CSS Custom Properties

Theme the widget purely from CSS — no JavaScript config required. Great fit for design-token systems.

CSS/* Bank's stylesheet — overrides widget appearance */
akrion-chat {
  --akrion-primary: #0891b2;
  --akrion-secondary: #6366f1;
  --akrion-accent: #f59e0b;
  --akrion-font: 'Inter', sans-serif;
  --akrion-bubble-size: 56px;
  --akrion-panel-width: 380px;
  --akrion-panel-height: 520px;
  --akrion-border-radius: 16px;
}

Advanced Styling with ::part()

For deeper customisation, the component exposes named parts that can be styled from outside the Shadow DOM:

CSSakrion-chat::part(bubble) {
  box-shadow: 0 8px 32px rgba(8, 145, 178, 0.4);
}

akrion-chat::part(panel) {
  border: 2px solid var(--brand-primary);
}

akrion-chat::part(header) {
  background: var(--brand-primary);
}

akrion-chat::part(send-button) {
  background: var(--brand-accent);
}

Content Projection via Slots

Banks can inject custom HTML into designated regions of the widget using named <slot> elements:

HTML<akrion-chat tenant-id="coastal" api-url="https://akrion-apim.azure-api.net">
  <!-- Replace default "Powered by Akrion One" footer -->
  <div slot="custom-footer">
    <img src="/coastal-logo.png" alt="Coastal CU" style="height: 20px;" />
    <span>Powered by Coastal CU AI</span>
  </div>

  <!-- Custom welcome message -->
  <div slot="welcome">
    <h3>G'day! 👋</h3>
    <p>I'm your Coastal CU assistant. Ask me about accounts, loans, or rates.</p>
  </div>
</akrion-chat>

Programmatic API

The Web Component exposes public methods and reactive properties on the element itself:

JavaScriptconst chat = document.querySelector('akrion-chat');

// Methods
chat.open();                              // Open the chat panel
chat.close();                             // Close the chat panel
chat.toggle();                            // Toggle open/close
chat.sendMessage('What is my balance?');  // Send message programmatically
chat.clearConversation();                 // Clear and start a new session
chat.setCustomer('coastal-cust-001');     // Set authenticated customer context

// Reactive properties (reflected to attributes)
chat.tenantId;       // 'coastal'
chat.apiUrl;         // 'https://akrion-apim.azure-api.net'
chat.isOpen;         // true / false
chat.isExpanded;     // true / false
chat.messageCount;   // 5

Using the Web Component in React

The Web Component works natively in React — just use the custom element tag. For idiomatic React usage, the Phase 2 @akrion-one/react package ships a thin wrapper that forwards refs and typed props:

React / TypeScript// Option 1 — direct custom element (works today)
export default function BankingApp() {
  return (
    <akrion-chat
      tenant-id="coastal"
      api-url={process.env.REACT_APP_AKRION_URL}
      position="bottom-right"
      theme="auto"
    />
  );
}

// Option 2 — React wrapper (Phase 2)
import { AkrionChat } from '@akrion-one/react';

export default function BankingApp() {
  const chatRef = useRef<HTMLElement>(null);

  useEffect(() => {
    chatRef.current?.addEventListener('akrion:escalation', handleEscalation);
  }, []);

  return (
    <AkrionChat
      ref={chatRef}
      tenantId="coastal"
      apiUrl={process.env.REACT_APP_AKRION_URL}
      theme="auto"
    />
  );
}

Migration from JS Widget

Banks already using the Phase 1 JS Widget can migrate incrementally — there's no breaking change. Both methods use the same backend APIs and tenant configuration.

HTML — Before (Phase 1 JS Widget)<script
  src="https://cdn.akrion.one/widget/v1/akrion-widget.js"
  data-tenant-id="coastal"
  data-api-url="https://akrion-apim.azure-api.net"
></script>
HTML — After (Phase 1.5 Web Component)<script
  type="module"
  src="https://cdn.akrion.one/widget/v1.5/akrion-chat.js"
></script>
<akrion-chat
  tenant-id="coastal"
  api-url="https://akrion-apim.azure-api.net"
></akrion-chat>
🔒 APRA CPS 234 Alignment

The Shadow DOM boundary provides stronger information asset isolation between the bank's page and the Akrion widget — host-page JavaScript cannot directly query the Shadow DOM, reducing the risk of third-party scripts (tag managers, analytics) accessing customer conversation data. This supports CPS 234 §24 (information asset controls proportionate to criticality).

When to Choose Web Component vs JS Widget

ScenarioRecommended
Quick POC / pilot / static content siteJS Widget (Phase 1)
Production web banking portalWeb Component (Phase 1.5)
Bank has a design system with CSS tokensWeb Component — CSS Custom Properties fit natively
SPA (React / Vue / Angular / Svelte)Web Component — proper DOM lifecycle
Multi-tenant admin dashboardWeb Component — multiple instances, reactive attributes
Contact centre / fully custom UIREST API — see API Reference

See also: full Web Component technical design doc with reference implementation (~200 LOC), Shadow DOM structure, and comparison matrix.

Admin & Escalation Widget

The Akrion One Admin Widget provides bank staff with a dashboard for reviewing AI-assisted conversations, managing escalations, and monitoring agent performance. This is the future path to a fully embeddable admin widget that can be integrated into your existing back-office tools.

ℹ️ Roadmap

The standalone admin dashboard is available now. The embeddable admin widget (for integration into existing CRM/back-office systems) is on the Phase 2 roadmap.

Admin Dashboard Features

Embedding the Admin Widget (Phase 2)

When available, the admin widget will be embeddable via a similar script-tag approach:

HTML<!-- Akrion One Admin Widget (Phase 2) -->
<div id="akrion-admin"></div>
<script
  src="https://cdn.akrion.one/admin/v1/akrion-admin.js"
  data-tenant-id="YOUR_TENANT_ID"
  data-admin-token="YOUR_ADMIN_TOKEN"
  data-target="#akrion-admin"
  data-view="escalations"
></script>

Admin API Endpoints

GET /api/v1/admin/{tenant_id}/conversations

List all conversations for the tenant. Supports pagination, date filtering, and status filtering.

GET /api/v1/admin/{tenant_id}/escalations

List pending escalations requiring human review. Includes conversation context and agent reasoning.

POST /api/v1/admin/{tenant_id}/escalations/{id}/resolve

Resolve an escalation with a human decision. Records the outcome for audit and agent learning.

API Reference

The Akrion One REST API is the foundation for all integrations. All requests require the X-Tenant-Id header and a valid API key.

Authentication

HTTPGET /api/v1/conversations
Host: api.akrion.one
Authorization: Bearer ak_live_xxxxxxxxxxxx
X-Tenant-Id: acme
Content-Type: application/json

Conversations

POST /api/v1/conversations

Start a new conversation. Returns a conversation_id for subsequent messages.

POST /api/v1/conversations/{id}/messages

Send a customer message and receive the agent's response. The orchestrator routes to the appropriate specialist agent.

GET /api/v1/conversations/{id}

Retrieve full conversation history including agent reasoning and tool calls (for audit).

Knowledge Base

POST /api/v1/knowledge/{tenant_id}/documents

Upload a document to the tenant's knowledge base. Supports Markdown, PDF, and plain text. Triggers re-indexing.

GET /api/v1/knowledge/{tenant_id}/documents

List all documents in the tenant's knowledge base with metadata and indexing status.

Agent Status

GET /api/v1/agents/health

Health check for all agents. Returns per-agent status, version, and last activity timestamp.

Tenant Setup

Onboarding a new bank or credit union to Akrion One involves four key steps:

1

Provision Tenant

Create the tenant record in Akrion One. This provisions the data partition (Cosmos DB container), AI Search index (knowledge-{tenant_id}), and ADLS storage container.

Pythonfrom akrion.admin import TenantManager

manager = TenantManager(admin_key="ak_admin_xxx")
tenant = manager.create_tenant(
    tenant_id="newbank",
    display_name="New Bank Australia",
    region="australiaeast",
    core_banking_url="https://newbank-opentransact.akrion.one",
    branding={
        "primary_color": "#1a5276",
        "logo_url": "https://newbank.com.au/logo.svg"
    }
)
2

Connect Core Banking

Configure the core banking adapter to point to the bank's transaction system. Akrion One ships with an OpenTransact adapter (Temenos Transact-compatible API).

JSON{
  "tenant_id": "newbank",
  "core_banking": {
    "adapter": "opentransact",
    "base_url": "https://newbank-opentransact.akrion.one/api/v1",
    "auth": {
      "type": "managed_identity",
      "resource": "api://opentransact-newbank"
    }
  }
}
3

Upload Knowledge Base

Upload tenant-specific documents for RAG indexing. These include product descriptions, fee schedules, lending policies, T&Cs, and FAQs.

Bash# Upload all knowledge documents for a tenant
akrion-cli knowledge upload \
  --tenant-id newbank \
  --source ./content/newbank/ \
  --format markdown
4

Configure & Launch

Set agent policies, escalation rules, and branding. Run UAT with the bank's team, then activate for live traffic.

Knowledge Base

Each tenant's knowledge base is a collection of Markdown documents indexed in Azure AI Search. Agents use RAG (Retrieval-Augmented Generation) to provide accurate, contextual answers grounded in the tenant's actual product and policy data.

Document Types

DocumentDescriptionExample
product-terms.mdProduct descriptions, features, eligibilityEveryday Account, Term Deposits, Home Loans
fee-schedule.mdAll fees and chargesMonthly fees, ATM charges, international transfer fees
lending-policy.mdLending criteria, LVR limits, assessment rulesMax LVR 80%, serviceability buffer 3%
terms-and-conditions.mdLegal T&Cs for all productsAccount closure, cooling-off periods
compliance-rules.mdRegulatory and compliance guidelinesAPRA reporting, AML/KYC requirements
faqs.mdFrequently asked questionsHow to reset password, how to dispute a charge
✅ Best Practice

Keep documents focused and well-structured with clear headings. The AI Search chunking strategy works best with documents under 50KB each, using Markdown headers (H2, H3) for section boundaries.

Escalation Workflows

Akrion One automatically escalates to human review when:

Escalation Flow

SequenceCustomer → Agent → Confidence check → Below threshold?
  ├── Yes → Create escalation ticket → Notify admin → Queue for human review
  └── No  → Deliver response to customer

Escalation Ticket includes:
  • Full conversation history
  • Agent reasoning trace
  • Confidence scores per turn
  • Suggested resolution (agent's best-effort response)
  • Customer context (ID, segment, risk profile)

Webhook Integration

Receive real-time escalation notifications via webhook to route into your existing CRM or ticketing system:

JSON{
  "event": "escalation.created",
  "tenant_id": "coastal",
  "escalation_id": "esc_20260415_001",
  "conversation_id": "conv_abc123",
  "reason": "loan_amount_exceeds_threshold",
  "priority": "high",
  "customer_id": "CUST-BH-001",
  "agent_type": "loan-processing",
  "suggested_action": "Review home loan application for $450,000",
  "created_at": "2026-04-15T14:30:00Z"
}

Security & Compliance

Security and compliance are foundational to Akrion One, not afterthoughts. Every design decision considers APRA CPS 234 requirements.

ControlImplementation
Tenant IsolationLogical isolation via X-Tenant-Id header. Cosmos DB partitioning, per-tenant AI Search indexes, ADLS containers.
Data SovereigntyAll processing in Australia East/Southeast. No data leaves Australian Azure regions.
EncryptionTLS 1.3 in transit. AES-256 at rest. Customer-managed keys supported via Key Vault.
Audit TrailsCorrelation IDs on every request. Full conversation logs with agent reasoning. Immutable audit store.
Content SafetyAzure AI Content Safety for prompt-injection detection, harmful content filtering, and PII redaction.
IdentityMicrosoft Entra ID with Managed Identities for service-to-service auth. Conditional access policies per tenant.
MonitoringAzure Defender for Cloud, Sentinel integration, real-time security alerts.

Agent Types

Akrion One ships with specialist agents across three phases:

MVP Agents (Available Now)

AgentPurposeKey Tools
OrchestratorIntent classification and routingclassify_intent, route_to_agent, policy_check
Account QueryBalance, transactions, account detailsget_balance, get_transactions, get_account_details
Loan ProcessingLoan enquiry, pre-qualification, applicationassess_eligibility, submit_application, get_status
NotificationProactive alerts (fraud, payments, offers)send_alert, schedule_reminder
IngestionKnowledge base document processingingest_document, reindex_tenant

Phase 2 (Roadmap)

AgentPurpose
Investment AdviceTerm deposit recommendations, savings optimisation
Enhanced Fraud AlertsReal-time fraud pattern detection and customer notification

Configuration

Tenant configuration is managed via environment variables and the admin API:

Environment Variables# Required
AKRION_TENANT_ID=coastal
AKRION_API_KEY=ak_live_xxxxxxxxxxxx
CORE_BANKING_URL=https://coastal-opentransact.akrion.one/api/v1

# AI Configuration
FOUNDRY_PROJECT_ID=akrion-one-prod
FOUNDRY_AGENT_MODE=foundry_agent_service
AI_MODEL=gpt-5.1
EMBEDDING_MODEL=text-embedding-3-large
SEARCH_INDEX_PREFIX=knowledge

# Escalation Thresholds
ESCALATION_LOAN_THRESHOLD=200000
ESCALATION_CONFIDENCE_THRESHOLD=0.7

# Feature Flags
ENABLE_PROACTIVE_NOTIFICATIONS=true
ENABLE_INVESTMENT_ADVICE=false

Code Samples

Python — Send a Message

Pythonimport httpx

AKRION_API = "https://api.akrion.one/api/v1"
TENANT_ID = "acme"
API_KEY = "ak_live_xxxxxxxxxxxx"

# Start a conversation
resp = httpx.post(
    f"{AKRION_API}/conversations",
    headers={
        "Authorization": f"Bearer {API_KEY}",
        "X-Tenant-Id": TENANT_ID,
    },
    json={"customer_id": "CUST-SC-001"}
)
conversation_id = resp.json()["conversation_id"]

# Send a message
resp = httpx.post(
    f"{AKRION_API}/conversations/{conversation_id}/messages",
    headers={
        "Authorization": f"Bearer {API_KEY}",
        "X-Tenant-Id": TENANT_ID,
    },
    json={"message": "What's my everyday account balance?"}
)

print(resp.json()["response"])
# → "Your Everyday Account (****4521) balance is $12,450.30 as of today."

JavaScript — Widget Events

JavaScript// Listen for widget events
window.addEventListener('akrion:ready', () => {
  console.log('Akrion One widget loaded');
});

window.addEventListener('akrion:message', (event) => {
  const { role, content, agentType } = event.detail;
  console.log(`[${agentType}] ${role}: ${content}`);
});

window.addEventListener('akrion:escalation', (event) => {
  const { escalationId, reason, priority } = event.detail;
  // Route to your CRM/ticketing system
  createSupportTicket({
    externalId: escalationId,
    reason: reason,
    priority: priority
  });
});

cURL — API Quick Test

Bash# Health check
curl -s https://api.akrion.one/api/v1/agents/health \
  -H "Authorization: Bearer ak_live_xxxxxxxxxxxx" \
  -H "X-Tenant-Id: acme" | jq .

# Start conversation and send message
CONV_ID=$(curl -s -X POST https://api.akrion.one/api/v1/conversations \
  -H "Authorization: Bearer ak_live_xxxxxxxxxxxx" \
  -H "X-Tenant-Id: acme" \
  -H "Content-Type: application/json" \
  -d '{"customer_id": "CUST-SC-001"}' | jq -r .conversation_id)

curl -s -X POST "https://api.akrion.one/api/v1/conversations/$CONV_ID/messages" \
  -H "Authorization: Bearer ak_live_xxxxxxxxxxxx" \
  -H "X-Tenant-Id: acme" \
  -H "Content-Type: application/json" \
  -d '{"message": "Show me my last 5 transactions"}' | jq .

LOS Gateway — Bank Integration

The Akrion LOS Gateway is the REST contract that a tenant bank exposes so that the Akrion One Loan Processing Agent can perform end-to-end loan origination on the bank's behalf — discovering products, running serviceability under the bank's own credit policy, creating applications, attaching documents, and capturing officer decisions.

📘 Three documents, one contract
  • Developer Guide — the practical "how do I implement this?" walkthrough for bank engineering teams.
  • Specification — the authoritative wire contract (8 endpoints, role mappings, error shapes).
  • OpenAPI 3.1 — machine-readable schema for code generation and contract testing.

What you'll build

A thin adapter (FastAPI / .NET / Spring) that terminates the Akrion contract, validates the Microsoft Entra-issued JWT, and translates each call into your existing LOS:

If your LOS is…Wrap…
SimpologyLoanapp REST (/loans, /applications) — mirror their LVR ladder verbatim
SandstoneSandstone Origination Suite REST — surface their applicationId as application_id
CloudcaseCloudcase Apply API — wire pre-qualification into POST /serviceability/check
nCinoSalesforce REST + nCino LoanApp objects — Connected App for inbound, Flow for serviceability
GreenfieldUse opentransact/ directly as the reference implementation

Federated identity at a glance

Each pilot bank gets its own Microsoft Entra app registration; a token minted for one bank cannot be replayed against another (HTTP 403 audience mismatch). This is the cryptographic tenant boundary required by APRA CPS 234 §35–36.

Bash# 1. Create your bank's app registration (one-off)
BANK="acme"
az ad app create \
  --display-name "OpenTransact (${BANK})" \
  --sign-in-audience AzureADMyOrg \
  --identifier-uris "api://opentransact-${BANK}"

# 2. Configure your gateway (env vars)
export AKRION_TENANT_ID="<Akrion's Entra tenant id>"
export OPENTRANSACT_EXPECTED_AUDIENCE="api://opentransact-${BANK}"
# Production must NEVER set OPENTRANSACT_AUTH_BYPASS

The 8 endpoints

MethodPathRole
GET/api/v1/loans/productsLOS.Read
GET/api/v1/loans/products/{id}/ratesLOS.Read
POST/api/v1/loans/serviceability/checkLOS.Read
POST/api/v1/loans/applicationsLOS.Submit
GET/api/v1/loans/applicationsLOS.Read
GET/api/v1/loans/applications/{id}LOS.Read
POST/api/v1/loans/applications/{id}/documentsLOS.Submit
POST/api/v1/loans/applications/{id}/decisionLOS.Submit

Webhook callbacks (Phase 4)

Banks push application status changes back to Akrion (rather than Akrion polling). Mutual JWT auth (the bank's app calls Akrion's api://akrion-platform), HMAC-SHA256 body signature, idempotency key, 5-minute clock-skew tolerance. The full contract is in Developer Guide §5.

⚠️ Conformance before production traffic

Every bank gateway must pass the Akrion conformance pack (opentransact/backend/tests/conformance/) before we route production traffic to it — including JWT replay tests, cross-tenant audience rejection, role enforcement, and the application state machine. See Dev Guide §7.

Need help onboarding (app registrations, role assignments, audience values)? Email contact@akrion.one.

© 2026 Akrion AI Pty Ltd · akrion.one · Privacy & RAI · Contact · Built on Microsoft Azure