Home/Developers

Developers

Package to live endpoint. Four steps.

Download, install, wire a source to a destination, and curl it. No sales engineer required, no licence server to phone home to, no three-day environment build.

install.sh
# 1. unpack the releasetar -xzf linkiir-grid-3.4.1-linux-amd64.tar.gzcd linkiir-grid # 2. bring up the runtime, broker and console./grid init --license ./linkiir.lic./grid up # runtime      online   :7440# broker       online   :9092# console      online   http://localhost:8080# archiver-1   online # 3. create the demo project./grid project create "Getting Started" --template http-echo
-- Transform node: HL7 v2 ADT in, FHIR Patient outlocal fhir = require "fhir" function main(Data)  local Msg, MsgType = hl7.parse{ schema='adt.json', data=Data }   local patient = fhir.Patient{    identifier = {{ system = 'urn:oid:2.16.840.1.113883.3.42',                    value  = Msg.PID[3][1][1]:nodeValue() }},    name       = {{ family = Msg.PID[5][1][1]:nodeValue(),                    given  = { Msg.PID[5][1][2]:nodeValue() }}},    birthDate  = date.iso(Msg.PID[7][1]:nodeValue())  }   if not patient.valid() then    return queue.dead{ reason = 'PID incomplete', data = Data }  end   queue.push{ data = patient:json() }end
{  "name": "epic-adt-to-fhir",  "nodes": [    {      "type": "source.llp",      "name": "Epic ADT IN",      "port": 5245, "ackMode": "enhanced"    },    {      "type": "transform.custom",      "script": "main.lua",      "libraries": ["fhir", "date"]    },    {      "type": "destination.custom",      "adapter": "azure-fhir",      "resource": "Patient", "retry": 5    }  ],  "durability": "at-least-once", "replay": true}
# 4. call itcurl -X POST http://localhost:7440/v1/workflows/epic-adt-to-fhir \  -H "Authorization: Bearer $GRID_TOKEN" \  -H "Content-Type: application/hl7-v2" \  --data-binary @sample-adt-a08.hl7 {  "messageId": "01JR8W2XQ4T7N9",  "status": "accepted",  "parsedAs": "ADT^A08",  "parseMicros": 380,  "destinations": [    { "adapter": "azure-fhir", "http": 201, "ms": 11 }  ],  "replayable": true}

Tabs advance on their own. Click to take over.

Documentation map

Written by the people who wrote the engine.

Which is why it tells you the awkward part instead of skipping it.

01

Getting started

Four steps from a downloaded package to a live HTTP endpoint you can call with curl. Receive HL7 v2 over MLLP. Connect your own Kafka or Redpanda.

Open ↗
02

Interface development

Source, Transform and Destination nodes: every configuration option, the Lua scripting API, shared libraries, and worked samples per message type.

Open ↗
03

Administration

Installation, licensing, deployment topologies, broker and log-archive database choices, security configuration, upgrades and troubleshooting.

Open ↗
04

FAQ

Database choices, licensing limits, operating practices, and the questions people actually email us at 11 p.m.

Open ↗
Lua scripting API

Small surface. Nothing hidden.

Transforms run sandboxed Lua 5.4: no host filesystem, no shell. What you get instead is a message API that makes the common thing one line and the awkward thing possible.

Parsing & building
hl7.parse{}Parse to a typed tree; returns message and type
hl7.message{}Build an outgoing message from a schema
fhir.Resource{}Construct and validate any R4/R5 resource
x12.parse{}Parse a 5010 transaction set into loops and segments
json / xml / csvEncode and decode with schema awareness
Mapping
Msg:mapTree()Copy the whole structure, then override what differs
node:nodeValue()Read a leaf without guessing at delimiters
Msg:S()Serialise back to wire format
Flow control
queue.push{}Send downstream, durably
queue.dead{}Dead-letter with a reason you'll thank yourself for
store / lookupCross-message state and cross-reference tables
alert{} / log{}Structured logging and notification-engine triggers

Full signatures, arguments and worked examples in the API reference ↗.

Control plane, over HTTP

Everything the console does, the API does. Deploy interfaces from CI, gate promotion on a passing run-test, replay a window from a script.

POST /v1/projects/:id/deploy
# promote a reviewed branch into productioncurl -X POST \  https://grid.example.org/v1/projects/regional/deploy \  -H "Authorization: Bearer $GRID_TOKEN" \  -d '{"ref":"release/2026.08","runTests":true}' { "deployment": "dpl_01JR8W", "tests": "42 passed",  "workflows": 18, "rollbackTo": "dpl_01JR3K" }

Auth

Bearer tokens scoped per project and action, or mTLS client certs. Tokens are revocable and audited.

Webhooks

Subscribe to deploys, dead-letters, threshold breaches and replay completions.

OpenAPI

A published spec, so your client is generated rather than hand-written.

Versioning

/v1 is stable. Breaking changes get a new path and twelve months of overlap.

Get started

The first hour, in order.

Get the package

A single tarball or container image, plus a licence file. Works offline, with nothing calling home. Ask for an evaluation licence and you'll have it the same day.

Bring up the runtime

grid init then grid up. Runtime, broker, notification engine, archiver and console. The bundled broker is fine to start with; point it at your own Kafka or Redpanda when you're ready.

Wire the first workflow

Start from the http-echo or llp-passthrough template, then swap the destination for a real one. The node parameter docs are in the panel beside each field.

Send a message

curl it, or point your test MLLP sender at port 5245. Watch it land in the Monitor, open the parsed tree, then break it on purpose and replay it.

LNK-5107 · Jira Service Managementavg. first reply 7 min
JT
JordanPlatform eng14:02

Is there a way to make mapTree skip a segment? I want everything except ZPD.

AL
Alixlinkiir14:06

Yes. MsgOut:mapTree(MsgIn, {skip={'ZPD'}}). It takes a table of segment names or a predicate. I'll add the example to the docs page today, it's under-documented.

JT
JordanPlatform eng14:07

Perfect, thanks.

Help

Ask an engineer, get an engineer.

Raise it in Jira Service Management and it reaches the people who build Grid, not a bot, not a triage script, and not a case number that sits until someone reassigns it. Median first reply last quarter was seven minutes.

7 min
Median first reply
24×7
Included with the licence