EAM Middleware · Integration layer

One governed API for every EAM system.

Stop building point-to-point integrations. EAM Middleware normalizes IBM Maximo and Cityworks behind a single REST API — so your apps, analytics, and AI pipelines talk to one data plane.

Source license · deploy on-prem, GovCloud, or air-gapped

EAM Middleware · Integration Console LIVE

Request pipeline

Waiting for inbound request…

STANDBY

1 · Ingest

2 · Route

3 · Normalize

4 · Respond

// middleware event stream
>

Latency

Schema

unified/v1

Status

ready

The data plane

Every backend speaks a different language.
Your apps shouldn't have to.

Legacy protocols terminate at the middleware. Applications see one normalized model — assets, work orders, inventory, and projects — no matter which system holds the record.

Systems of record
IBM MaximoOSLC ingestion
CityworksREST · GIS assets
EAM Middleware normalize · auth · route
Common modelJWT + RBACAudit log
Consumers
Apps & dashboardsone schema
AI & ML pipelinesunified history
Source license

What you get in the source code

Full middleware codebase for on-prem or private-cloud deployment — not a black-box SaaS dependency you can never leave.

Universal connector layer

Applications call one REST API. The middleware translates into Maximo OSLC and Cityworks REST, returning normalized assets, work orders, inventory, and projects.

Common data model

Standardized schemas across backends so dashboards, mobile apps, and ML pipelines don't fork per EAM vendor.

Real-time sync

WebSocket fan-out for live work-order and asset updates — field crews and control rooms see the same state.

Enterprise security

JWT bearer authentication, role-based access control, TLS 1.3, and audit logging designed for CISO review.

ML-ready pipeline

Unified history across systems — the prerequisite for failure prediction, anomaly detection, and maintenance optimization models.

Deploy anywhere

Source license for air-gapped, GovCloud, or on-prem stacks. Extend connectors and APIs without vendor gatekeeping.

How it works

Built to absorb complexity
so your apps
don't have to

Unified routing

One request, translated everywhere

Your application makes a single normalized call. The
middleware routes it to the right backend, speaks its
native protocol, and returns a common shape every time.

  • Maximo OSLC and Cityworks REST behind one endpoint
  • Assets, work orders, inventory & projects — normalized
  • Add new backend without touching consumer code
Supported integrations
IBM Maximo
Cityworks
AWS
DigitalOcean
GET /api/v1/assets/4821 Maximo
GET /api/v1/workorders?status=open Cityworks

  "id""4821"
  "type""pump_station"
  "status""operational"
  "source""maximo"
  "workorders"3 open
Capabilities

Simplify integration, build governed apps

Sync, security, normalization, and deployment — the middleware handles complexity so your teams ship faster.

Real-time sync across every consumer

A change in the field propagates instantly. WebSocket fan-out keeps control rooms, dashboards, and mobile crews on the same state — no polling, no drift.

Control roomsynced
Field crew appsynced
Analytics dashboardsynced

Security designed for CISO review

Government-grade controls are built in, not bolted on. Every request is authenticated, authorized, encrypted, and logged — ready for security review.

JWT bearer auth
Role-based access
TLS 1.3 encryption
Full audit logging

One normalized model for every backend

Assets, work orders, inventory, and projects share one JSON shape — so dashboards, mobile apps, and ML pipelines never fork per EAM vendor.

+ /api/v1
assets · normalized schema
workorders · shared status model
inventory · cross-system IDs

Deploy anywhere you operate

Source license for air-gapped, GovCloud, or on-prem stacks. Extend connectors and APIs without vendor gatekeeping.

On-prem · air-gapped
GovCloud · IL5 ready
AWS · private VPC
One integration surface

Everything your apps need, on one API

REST for reads and writes, WebSockets for live state, JWT + RBAC for access, and audit logging on every call.
Versioned routes, normalized payloads, and full traceability from a single governed endpoint.

One REST surface for every backend

Read and write assets, work orders, inventory, and projects through a single normalized API the middleware routes each call to Maximo or Cityworks.

  • Consistent JSON shape across systems
  • <100ms typical response
  • Versioned routes with middleware guards
  • Deep telemetry & logging for request payloads, response latencies, and backend health.
Explore the API

Live state over WebSockets

Subscribe once and receive every asset and work-order change as it happens. Control rooms, dashboards, and field apps stay in lockstep — no polling.

  • Event fan-out to every consumer
  • Zero dropped events under load
  • Normalized payloads on every stream
Explore WebSockets

Every change, on the record

A tamper-evident audit trail logs who did what, when, and against which system — the evidence your compliance and security reviews depend on.

  • Exportable for CISO & compliance
  • Signed, immutable log entries
  • Cross-system attribution per action
View audit trail

Authenticated, authorized, encrypted

Every request carries a JWT bearer token. Role-based access control decides what each caller can read or write, over TLS 1.3 end to end.

  • Least-privilege roles per consumer
  • JWT scopes enforced on every route
  • TLS 1.3 end-to-end encryption
Explore auth
api.php
AssetController.php
use Illuminate\Support\Facades\Route;
use App\Http\Controllers\AssetController;

Route::middleware('auth:api')->group(function () {
    Route::get('/api/v1/assets/{id}', [AssetController::class, 'show']);
    Route::get('/api/v1/workorders', [AssetController::class, 'index']);
});
StreamHandler.php
events.log
public function broadcast(AssetUpdated $event)
{
    $payload = $event->normalize();

    return $this->ws()->emit('asset.updated', $payload);
}

// wss://eam/ws/v1/events
→ connected  asset.updated  #4821 status=operational
web.php
UserController.php
Route::get('/dashboard', function () {
    return view('dashboard');
})->middleware(['auth', 'verified']);

public function show(Request $request)
{
    $user = $request->user();
    return $user->load('roles.permissions');
}
AuditService.php
audit.log
$this->audit()->record([
    'actor'  => 'user:j.rivera',
    'action' => 'UPDATE',
    'target' => 'asset/4821',
    'source' => 'maximo',
]);

2026-07-08T10:24:01Z  UPDATE  asset/4821  src=maximo
✓ signed & immutable
Connectors

Supported systems today

Production-grade connectors — add more backends on the same middleware core.

IBM Maximo

OSLC ingestion, asset hierarchy, work management

Cityworks

REST API, GIS-centric public-works assets

Own it outright

Buy the full source code

One-time license via SendOwl — complete middleware source, connectors, and deployment docs. No recurring SaaS lock-in.

Source code license

EAM Middleware — full source

  • Complete middleware & connector source
  • IBM Maximo + Cityworks integrations
  • REST API + WebSocket sync layer
  • Security, auth & audit modules
  • Deployment & configuration docs
One-time license
Buy Now — Powered by SendOwl
Secure checkout · Powered by SendOwl

Pairs with GovAssetOS

EAM Middleware is the integration fabric; GovAssetOS is the PostGIS-native operating platform. Run middleware in front of legacy Maximo/Cityworks estates while you modernize on GovAssetOS.

Explore GovAssetOS
Before you buy

Frequently asked questions

What exactly is included in the source license?
The complete middleware codebase — the universal connector layer, IBM Maximo (OSLC) and Cityworks (REST) integrations, the REST API + WebSocket sync layer, the security/auth/audit modules, and deployment & configuration documentation.
Can I deploy this air-gapped or on GovCloud?
Yes. It's a source license, so you host it wherever you need — air-gapped, GovCloud, or on-prem. There's no callback to a vendor SaaS and no per-seat gatekeeping.
Which systems does it connect to?
Two production-grade connectors ship today: IBM Maximo and Cityworks. Because everything runs on one middleware core, you can extend it to additional backends without rewriting consumer applications.
How is payment and delivery handled?
Checkout is powered by SendOwl — secure payment and instant delivery of the source package and license after purchase.

Ready to unify your EAM stack?

Buy the source once, deploy it your way, and give every app one governed API instead of a maze of integrations.