Skip to content

Interface Engine: Definition, Channels, and How Routing Works

An interface engine is middleware that sits between healthcare systems and moves messages between them: it listens for inbound messages, parses them, decides which ones matter, reshapes them into the format the receiver expects, delivers them, and acknowledges the result.

It exists because healthcare systems do not speak to each other directly. A lab analyzer emits HL7 v2 in one vendor’s dialect, the EHR expects another, the billing system wants a flat file, and the data warehouse wants JSON. Without an engine in the middle, every pair of systems needs its own bespoke connection, and the number of connections grows with the square of the number of systems. With one, each system connects once.

Interface engine and integration engine mean the same thing. The two names are used interchangeably across the industry, and vendors are inconsistent about which they prefer. This page uses both.

The reason an engine exists at all. Connecting systems directly means a connection for every pair, so the count grows as n(n-1)/2: six systems need fifteen interfaces. Routing through an engine makes it six. Every system integrates once, against one contract, and the engine absorbs the differences between them.

Six jobs, in order. Every message that crosses an engine passes through all of them, and every engine on the market implements the same six under different names.

  1. Listen. Accept inbound messages over a transport: MLLP over TCP for HL7 v2, HTTPS for REST and FHIR, SFTP or a watched folder for batch files, a database poll, a message queue.
  2. Parse. Turn the raw bytes into a structure the engine can address, so a rule can refer to PID-3 or OBX-5 rather than to a character offset.
  3. Filter. Decide whether this message is wanted at all. Most feeds carry traffic a given destination does not need, and dropping it early is cheaper than transforming it.
  4. Transform. Reshape the message into what the receiver expects: rename fields, remap code sets, look values up against a table, split one message into several, or merge several into one.
  5. Route. Send the result to one or more destinations, choosing at runtime based on message content.
  6. Acknowledge. Return an ACK or NACK to the sender, and record what happened so a failed message can be found and replayed.
One Message, Source to Destination
Source Lab / EHR / Device
Interface Engine Channel
Destination EHR / Warehouse
Inbound message Listen, then parse
Filter runs here: unwanted messages are dropped before any work is done on them
Route and deliver One or more destinations
Transform runs first: fields mapped, code sets translated
Downstream ACK
ACK or NACK Sender learns the outcome
src eng
Inbound message Listen, then parse Filter runs here: unwanted messages are dropped before any work is done on them
eng dst
Route and deliver One or more destinations Transform runs first: fields mapped, code sets translated
dst eng
Downstream ACK
eng src
ACK or NACK Sender learns the outcome
What transform actually means, on one segment. The inbound OBX carries the sending lab's own result code and its own unit string. The transform maps the code to the LOINC the receiver expects, normalises the unit, and leaves the value untouched. Most interface work is this, repeated: the message is already nearly right, and the last few percent is what the engine exists to fix.

Engines organise work into channels. A channel is one inbound source plus the filters, transforms, and destinations attached to it, deployed and monitored as a unit. It is the thing you build, the thing that starts and stops, and the thing that appears in a queue-depth chart when something goes wrong.

The naming differs by product and the shape does not. Mirth Connect and OIE call it a channel with a source connector and destination connectors; Rhapsody calls it a route with communication points; Cloverleaf calls it a thread. A channel is the useful mental model across all of them.

One channel: a single source connector, the filter and transformer that run against every message it accepts, and the destination connectors it fans out to. The dashed boundary is the deployable unit. It starts, stops, queues and fails as a whole, which is why a broken transform costs you one feed rather than the engine.

One consequence matters operationally: because a channel is the unit, it is also the blast radius. A malformed transform takes down one feed rather than the engine, and a stopped channel is silent rather than loud, which is why channel state is the first thing worth monitoring.

The distinction is mostly about what the tool assumes it will be carrying.

AssumesStrengthTypical use
Interface engineHealthcare messages: HL7 v2, FHIR, X12, DICOMClinical formats, ACK semantics, message replayClinical and operational feeds between systems
ESBArbitrary enterprise servicesService orchestration, protocol breadthGeneral enterprise integration
iPaaSSaaS-to-SaaS APIs, cloud-hostedPrebuilt connectors, no infrastructureBusiness applications, light data movement

An ESB can carry HL7 v2, and an interface engine can call a REST API. The difference is what each is good at by default. An engine ships knowing what an MSH segment is, what an ACK means, and that a message that fails at 2am has to be findable and replayable at 9am. A general-purpose bus makes you build that.

In practice an interface engine sits at the boundary between a clinical system and everything else, and its position is what makes it both valuable and sensitive. It sees message content, which means it sees PHI, so it is in scope for HIPAA, needs encryption in transit, and needs an audit trail.

Why the engine's position is both useful and sensitive. Everything it carries is message content, which means PHI, which puts it in HIPAA scope: encryption in transit, an audit trail, and access control are not optional here. The same position is what lets it absorb problems that are awkward anywhere else, like holding messages while a destination is down.

That position also makes it the natural place to solve problems that are awkward anywhere else: throttling a downstream system that cannot keep up, holding messages while a destination is down, translating a code set once instead of in five applications, and giving one place to answer “did that result arrive?”.

The engines in common use in healthcare are Mirth Connect and its open-source successor OIE, Rhapsody, Cloverleaf, Iguana, Corepoint, and Ensemble/HealthShare. They differ on licence cost, hosting model, scripting language, clustering, and how much of the operational layer is included rather than built.

Comparing them is a separate question from understanding what one is, and it has its own page: